diff --git a/docs/modules/ROOT/pages/dependencies.adoc b/docs/modules/ROOT/pages/dependencies.adoc index c452fb9c7..4b1a65104 100644 --- a/docs/modules/ROOT/pages/dependencies.adoc +++ b/docs/modules/ROOT/pages/dependencies.adoc @@ -204,6 +204,12 @@ username/passwords. By default, `jbang` uses `~/.m2` as local repository, but this can be overwritten by the environment variable `JBANG_REPO`. +=== Transitive repositories + +JBang honors by default the repositories found in transitive dependencies (similar to how Maven does). + +You can however disable this by using the `--ignore-transitive-repositories` (or `-itr`) option. + == Using `@Grab` There is also support for using Groovy lang style `@Grab` syntax. diff --git a/src/main/java/dev/jbang/cli/DependencyInfoMixin.java b/src/main/java/dev/jbang/cli/DependencyInfoMixin.java index 46047cd01..32d175b5f 100644 --- a/src/main/java/dev/jbang/cli/DependencyInfoMixin.java +++ b/src/main/java/dev/jbang/cli/DependencyInfoMixin.java @@ -4,6 +4,8 @@ import java.util.List; import java.util.Map; +import dev.jbang.util.Util; + import picocli.CommandLine; public class DependencyInfoMixin { @@ -18,6 +20,13 @@ public class DependencyInfoMixin { @CommandLine.Option(names = { "--cp", "--class-path" }, description = "Add class path entries.") List classpaths; + @CommandLine.Option(names = { + "--ignore-transitive-repositories", + "--itr" }, description = "Ignore remote repositories found in transitive dependencies") + void setIgnoreTransitiveRepositories(boolean ignoreTransitiveRepositories) { + Util.setIgnoreTransitiveRepositories(ignoreTransitiveRepositories); + } + public List getDependencies() { return dependencies; } diff --git a/src/main/java/dev/jbang/dependencies/ArtifactResolver.java b/src/main/java/dev/jbang/dependencies/ArtifactResolver.java index ee3548638..b91d32857 100644 --- a/src/main/java/dev/jbang/dependencies/ArtifactResolver.java +++ b/src/main/java/dev/jbang/dependencies/ArtifactResolver.java @@ -48,6 +48,7 @@ public static class Builder { private List repositories; private int timeout; private boolean offline; + private boolean ignoreTransitiveRepositories; private boolean withUserSettings; private Path localFolder; private Path settingsXml; @@ -98,6 +99,11 @@ public Builder offline(boolean offline) { return this; } + public Builder ignoreTransitiveRepositories(boolean ignoreTransitiveRepositories) { + this.ignoreTransitiveRepositories = ignoreTransitiveRepositories; + return this; + } + public Builder logging(boolean logging) { this.loggingEnabled = logging; return this; @@ -132,6 +138,8 @@ private ArtifactResolver(Builder builder) { ContextOverrides.Builder overridesBuilder = ContextOverrides.create() .userProperties(userProperties) .offline(builder.offline) + .ignoreArtifactDescriptorRepositories( + builder.ignoreTransitiveRepositories) .withUserSettings(builder.withUserSettings) .withUserSettingsXmlOverride(builder.settingsXml) .withLocalRepositoryOverride(builder.localFolder) diff --git a/src/main/java/dev/jbang/dependencies/DependencyResolver.java b/src/main/java/dev/jbang/dependencies/DependencyResolver.java index 7a6c32a55..bc921f220 100644 --- a/src/main/java/dev/jbang/dependencies/DependencyResolver.java +++ b/src/main/java/dev/jbang/dependencies/DependencyResolver.java @@ -65,7 +65,8 @@ public DependencyResolver addClassPaths(List classPaths) { public ModularClassPath resolve() { ModularClassPath mcp = DependencyUtil.resolveDependencies( new ArrayList<>(dependencies), new ArrayList<>(repositories), - Util.isOffline(), Util.isFresh(), !Util.isQuiet(), Util.downloadSources()); + Util.isOffline(), Util.isIgnoreTransitiveRepositories(), Util.isFresh(), !Util.isQuiet(), + Util.downloadSources()); if (classPaths.isEmpty()) { return mcp; } else { diff --git a/src/main/java/dev/jbang/dependencies/DependencyUtil.java b/src/main/java/dev/jbang/dependencies/DependencyUtil.java index 8ea2b502f..7860ccdeb 100644 --- a/src/main/java/dev/jbang/dependencies/DependencyUtil.java +++ b/src/main/java/dev/jbang/dependencies/DependencyUtil.java @@ -53,7 +53,8 @@ private DependencyUtil() { } public static ModularClassPath resolveDependencies(List deps, List repos, - boolean offline, boolean updateCache, boolean loggingEnabled, boolean downloadSources) { + boolean offline, boolean ignoreTransitiveRepositories, boolean updateCache, boolean loggingEnabled, + boolean downloadSources) { // if no dependencies were provided we stop here if (deps.isEmpty()) { @@ -102,6 +103,8 @@ public static ModularClassPath resolveDependencies(List deps, List deps = Arrays.asList("com.offbytwo:docopt:0.6.0.20150202", "log4j:log4j:1.2+"); ModularClassPath classpath = DependencyUtil.resolveDependencies(deps, Collections.emptyList(), false, false, + false, true, false); // if returns 5 its because optional deps are included which they shouldn't @@ -151,6 +152,7 @@ void testResolveDependenciesNoDuplicates() { "org.apache.commons:commons-text:1.8"); ModularClassPath classpath = DependencyUtil.resolveDependencies(deps, Collections.emptyList(), false, false, + false, true, false); // if returns with duplicates its because some dependencies are multiple times @@ -172,6 +174,7 @@ void testResolveNativeDependencies() { List deps = Collections.singletonList("com.github.docker-java:docker-java:3.1.5"); ModularClassPath classpath = DependencyUtil.resolveDependencies(deps, Collections.emptyList(), false, false, + false, true, false); assertEquals(46, classpath.getClassPaths().size()); @@ -183,7 +186,7 @@ void testResolveJavaModules() throws IOException { List deps = Arrays.asList("org.openjfx:javafx-graphics:11.0.2:mac", "com.offbytwo:docopt:0.6+"); ModularClassPath cp = new ModularClassPath( - DependencyUtil .resolveDependencies(deps, Collections.emptyList(), false, false, true, false) + DependencyUtil .resolveDependencies(deps, Collections.emptyList(), false, false, false, true, false) .getArtifacts()) { @Override protected boolean supportsModules(JdkProvider.Jdk jdk) { @@ -205,6 +208,7 @@ void testImportPOM() { List deps = Arrays.asList("com.microsoft.azure:azure-bom:1.0.0.M1@pom", "com.microsoft.azure:azure"); ModularClassPath classpath = DependencyUtil.resolveDependencies(deps, Collections.emptyList(), false, false, + false, true, false); assertEquals(62, classpath.getArtifacts().size()); @@ -221,6 +225,7 @@ void testImportMultipleBoms() { "org.slf4j:slf4j-simple:1.7.30"); ModularClassPath classpath = DependencyUtil.resolveDependencies(deps, Collections.emptyList(), false, false, + false, true, false); Optional coord = classpath.getArtifacts() @@ -253,7 +258,7 @@ void testImportMultipleBoms() { "org.apache.camel:camel-core", "org.apache.camel:camel-vertx", "org.slf4j:slf4j-simple:1.7.30"); - classpath = DependencyUtil.resolveDependencies(deps, Collections.emptyList(), false, false, true, false); + classpath = DependencyUtil.resolveDependencies(deps, Collections.emptyList(), false, false, false, true, false); coord = classpath .getArtifacts() .stream() @@ -268,6 +273,7 @@ void testResolveTestJar() { List deps = Arrays.asList("org.infinispan:infinispan-commons:13.0.5.Final@test-jar"); ModularClassPath classpath = DependencyUtil.resolveDependencies(deps, Collections.emptyList(), false, false, + false, true, false); assertThat(classpath.getArtifacts(), hasSize(7)); diff --git a/src/test/java/dev/jbang/dependencies/TestArtifactInfo.java b/src/test/java/dev/jbang/dependencies/TestArtifactInfo.java index 8c0d2315c..d6e2b0e76 100644 --- a/src/test/java/dev/jbang/dependencies/TestArtifactInfo.java +++ b/src/test/java/dev/jbang/dependencies/TestArtifactInfo.java @@ -25,6 +25,7 @@ public void testDependencyCache() { "org.apache.commons:commons-text:1.8"); ModularClassPath classpath = DependencyUtil.resolveDependencies(deps, Collections.emptyList(), false, false, + false, true, false); DependencyCache.cache("wonka", classpath.getArtifacts());