diff --git a/build.gradle b/build.gradle index 0c29a9034..dbc293442 100644 --- a/build.gradle +++ b/build.gradle @@ -30,8 +30,12 @@ dependencies { implementation 'org.codehaus.plexus:plexus-java:1.0.5' implementation 'com.google.code.gson:gson:2.8.6' implementation 'org.jsoup:jsoup:1.13.1' - implementation 'org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-api:3.1.4' - implementation 'org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-impl-maven:3.1.4' + + implementation 'com.github.jbangdev.jbang-resolver:shrinkwrap-resolver-api:3.1.5-allowpom' + implementation 'com.github.jbangdev.jbang-resolver:shrinkwrap-resolver-impl-maven:3.1.5-allowpom' + + //implementation 'org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-api:3.1.4' + //implementation 'org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-impl-maven:3.1.4' implementation "org.slf4j:slf4j-nop:1.7.30" implementation "org.jboss:jandex:2.2.2.Final" //implementation 'org.apache.maven:maven-aether-provider:3.0.5' @@ -145,8 +149,11 @@ compileTestJava { shadowJar { minimize() { - exclude(dependency('org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-spi:.*')) - exclude(dependency('org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-impl-maven:.*')) + //exclude(dependency('org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-spi:.*')) + //exclude(dependency('org.jboss.shrinkwrap.resolver:shrinkwrap-resolver-impl-maven:.*')) + exclude(dependency('com.github.jbangdev.jbang-resolver:shrinkwrap-resolver-spi:.*')) + exclude(dependency('com.github.jbangdev.jbang-resolver:shrinkwrap-resolver-impl-maven:.*')) + //exclude(dependency('org.slf4j:slf4j-api:.*')) exclude(dependency('org.slf4j:slf4j-nop:.*')) exclude(dependency('org.jboss.logging:jboss-logging:.*')) diff --git a/src/main/java/dev/jbang/DependencyUtil.java b/src/main/java/dev/jbang/DependencyUtil.java index 1440f0b50..04e7f7d2e 100644 --- a/src/main/java/dev/jbang/DependencyUtil.java +++ b/src/main/java/dev/jbang/DependencyUtil.java @@ -21,9 +21,12 @@ import org.jboss.shrinkwrap.resolver.api.maven.MavenFormatStage; import org.jboss.shrinkwrap.resolver.api.maven.MavenResolvedArtifact; import org.jboss.shrinkwrap.resolver.api.maven.MavenStrategyStage; +import org.jboss.shrinkwrap.resolver.api.maven.MavenWorkingSession; import org.jboss.shrinkwrap.resolver.api.maven.PackagingType; +import org.jboss.shrinkwrap.resolver.api.maven.PomEquippedResolveStage; import org.jboss.shrinkwrap.resolver.api.maven.coordinate.MavenCoordinate; import org.jboss.shrinkwrap.resolver.api.maven.coordinate.MavenCoordinates; +import org.jboss.shrinkwrap.resolver.impl.maven.MavenWorkingSessionContainer; public class DependencyUtil { @@ -42,9 +45,12 @@ public class DependencyUtil { aliasToRepos.put("sponge", "https://repo.spongepowered.org/maven"); } - public static final Pattern gavPattern = Pattern.compile( + public static final Pattern fullGavPattern = Pattern.compile( "^(?[^:]*):(?[^:]*):(?[^:@]*)(:(?[^@]*))?(@(?.*))?$"); + public static final Pattern gavPattern = Pattern.compile( + "^(?[^:]*):(?[^:]*)(:(?[^:@]*))?(:(?[^@]*))?(@(?.*))?$"); + public ModularClassPath resolveDependencies(List deps, List repos, boolean offline, boolean loggingEnabled) { return resolveDependencies(deps, repos, offline, loggingEnabled, true); @@ -131,19 +137,48 @@ public List resolveDependenciesViaAether(List depIds, List mavenRepo.apply(resolver); }); + MavenWorkingSession xyz = ((MavenWorkingSessionContainer) resolver).getMavenWorkingSession(); System.setProperty("maven.repo.local", Settings.getLocalMavenRepo().toPath().toAbsolutePath().toString()); + List deps = depIds.stream().map(it -> depIdToArtifact(it)).collect(Collectors.toList()); + + PomEquippedResolveStage pomResolve = null; + + if (!depIds.isEmpty()) { + MavenCoordinate mc = depIdToArtifact(depIds.get(0)); + if (PackagingType.POM.equals(mc.getType())) { + if (loggingEnabled) { + infoMsg("Loading " + mc); + } + System.setProperty("jbang-allowpom", "true"); // big hack to trick shrinkwrap in actually get pom + // location + MavenStrategyStage resolve = resolver.resolve(mc.toCanonicalForm()); + pomResolve = resolver.loadPomFromFile(resolve.withoutTransitivity().asSingleFile()); + System.getProperties().remove("jbang-allowpom"); + depIds.remove(0); + } + } + + final PomEquippedResolveStage ps = pomResolve; + return depIds.stream().flatMap(it -> { + MavenCoordinate artifact = depIdToArtifact(it); + if (loggingEnabled) { infoHeader(); - infoMsgFmt(" Resolving %s...", it); + infoMsgFmt(" Resolving %s...", artifact); } List artifacts; try { - MavenStrategyStage resolve = resolver.resolve(depIdToArtifact(it).toCanonicalForm()); + MavenStrategyStage resolve; MavenFormatStage stage = null; + if (ps != null) { + resolve = ps.resolve(artifact.toCanonicalForm()); + } else { + resolve = resolver.resolve(artifact.toCanonicalForm()); + } if (transitively) { stage = resolve.withTransitivity(); @@ -151,6 +186,7 @@ public List resolveDependenciesViaAether(List depIds, List stage = resolve.withoutTransitivity(); } artifacts = stage.asList(MavenResolvedArtifact.class); // , RUNTIME); + } catch (RuntimeException e) { throw new ExitException(1, "Could not resolve dependency", e); } @@ -177,7 +213,7 @@ public String decodeEnv(String value) { } public static boolean looksLikeAGav(String candidate) { - Matcher gav = gavPattern.matcher(candidate); + Matcher gav = fullGavPattern.matcher(candidate); gav.find(); return (gav.matches()); } @@ -211,7 +247,7 @@ public MavenCoordinate depIdToArtifact(String depId) { public String formatVersion(String version) { // replace + with open version range for maven - if (version.endsWith("+")) { + if (version != null && version.endsWith("+")) { return "[" + removeLastCharOptional(version) + ",)"; } else { return version; diff --git a/src/test/java/dev/jbang/DependencyResolverTest.java b/src/test/java/dev/jbang/DependencyResolverTest.java index 7683cbe0a..29e892d3d 100644 --- a/src/test/java/dev/jbang/DependencyResolverTest.java +++ b/src/test/java/dev/jbang/DependencyResolverTest.java @@ -213,18 +213,18 @@ protected boolean supportsModules(String requestedVersion) { /* * @Ignore("BOM import not yet figured out with shrinkwrap") - * - * @Test void testImportPOM() { - * - * List deps = - * Arrays.asList("com.microsoft.azure:azure-bom:1.0.0.M1@pom", - * "com.microsoft.azure:azure"); - * - * String classpath = new DependencyUtil().resolveDependencies(deps, - * Collections.emptyList(), false, true); - * - * assertEquals(46, classpath.split(Settings.CP_SEPARATOR).length); - * - * } */ + @Test + void testImportPOM() { + + List deps = Arrays.asList("com.microsoft.azure:azure-bom:1.0.0.M1@pom", + "com.microsoft.azure:azure"); + + ModularClassPath classpath = new DependencyUtil().resolveDependencies(deps, + Collections.emptyList(), false, true); + + assertEquals(62, classpath.getArtifacts().size()); + + } + }