Skip to content

Commit c886a13

Browse files
committed
fix: missing source and jar deps now handled correctly
Fixes #2251
1 parent ecb63ea commit c886a13

File tree

12 files changed

+132
-47
lines changed

12 files changed

+132
-47
lines changed

itests/brokendeps_jar.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
//DEPS missing.jar
2+
3+
class brokendeps {
4+
public static void main(String... args) throws Exception {
5+
}
6+
}

itests/brokendeps_source.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
//DEPS missing.java
2+
3+
class brokendeps_source {
4+
public static void main(String... args) throws Exception {
5+
}
6+
}

src/main/java/dev/jbang/cli/Info.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ static class ScriptInfo {
117117
String gav;
118118
String module;
119119
Map<String, List<ProjectFile>> docs;
120+
List<ProjectFile> subProjects;
120121

121122
public ScriptInfo(Project prj, Path buildDir, boolean assureJdkInstalled) {
122123
originalResource = prj.getResourceRef().getOriginalResource();
@@ -181,10 +182,24 @@ private void init(Project prj) {
181182
if (!opts.isEmpty()) {
182183
runtimeOptions = opts;
183184
}
185+
List<Project> subps = prj.getSubProjects();
186+
if (!subps.isEmpty()) {
187+
subProjects = subps.stream()
188+
.map(Project::getResourceRef)
189+
.map(ProjectFile::new)
190+
.collect(Collectors.toList());
191+
if (dependencies == null) {
192+
dependencies = new ArrayList<>();
193+
}
194+
dependencies.addAll(
195+
subps.stream().map(p -> p.getResourceRef().getOriginalResource()).collect(Collectors.toList()));
196+
}
184197
}
185198

186199
private void init(SourceSet ss) {
187-
List<String> deps = ss.getDependencies();
200+
List<String> deps = new ArrayList<>();
201+
deps.addAll(ss.getDependencies());
202+
deps.addAll(ss.getClassPaths());
188203
if (!deps.isEmpty()) {
189204
dependencies = deps;
190205
}

src/main/java/dev/jbang/dependencies/DependencyResolver.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
package dev.jbang.dependencies;
22

33
import java.io.File;
4+
import java.nio.file.Path;
45
import java.util.*;
56
import java.util.stream.Collectors;
67
import java.util.stream.Stream;
78

9+
import org.jspecify.annotations.NonNull;
10+
11+
import dev.jbang.resources.ResourceNotFoundException;
812
import dev.jbang.util.Util;
913

1014
public class DependencyResolver {
@@ -73,10 +77,17 @@ public ModularClassPath resolve() {
7377
// WARN need File here because it's more lenient about paths than Path!
7478
Stream<ArtifactInfo> cpas = classPaths
7579
.stream()
76-
.map(p -> new ArtifactInfo(null, new File(p).toPath()));
80+
.map(p -> new ArtifactInfo(null, assertExists(new File(p).toPath())));
7781
List<ArtifactInfo> arts = Stream.concat(mcp.getArtifacts().stream(), cpas)
7882
.collect(Collectors.toList());
7983
return new ModularClassPath(arts);
8084
}
8185
}
86+
87+
private @NonNull Path assertExists(@NonNull Path p) {
88+
if (!p.toFile().exists()) {
89+
throw new ResourceNotFoundException(p.toString(), "Jar dependency not found: " + p);
90+
}
91+
return p;
92+
}
8293
}

src/main/java/dev/jbang/dependencies/DependencyUtil.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import java.util.List;
1313
import java.util.Map;
1414
import java.util.Optional;
15+
import java.util.function.Predicate;
1516
import java.util.regex.Matcher;
1617
import java.util.regex.Pattern;
1718
import java.util.stream.Collectors;
@@ -197,4 +198,32 @@ public static MavenRepo toMavenRepo(String repoReference) {
197198
return new MavenRepo(repoid, reporef);
198199
}
199200
}
201+
202+
public static Predicate<String> gavDepFilter() {
203+
return DependencyUtil::isGav;
204+
}
205+
206+
private static boolean isGav(String ref) {
207+
return looksLikeAPossibleGav(ref) || !JitPackUtil.ensureGAV(ref).equals(ref);
208+
}
209+
210+
public static List<String> filterGavDeps(List<String> deps) {
211+
return deps.stream().filter(gavDepFilter()).collect(Collectors.toList());
212+
}
213+
214+
public static Predicate<String> jarDepFilter() {
215+
return d -> d.endsWith(".jar");
216+
}
217+
218+
public static List<String> filterJarDeps(List<String> deps) {
219+
return deps.stream().filter(jarDepFilter()).collect(Collectors.toList());
220+
}
221+
222+
public static Predicate<String> sourceDepFilter() {
223+
return gavDepFilter().negate().and(jarDepFilter().negate());
224+
}
225+
226+
public static List<String> filterSourceDeps(List<String> deps) {
227+
return deps.stream().filter(sourceDepFilter()).collect(Collectors.toList());
228+
}
200229
}

src/main/java/dev/jbang/source/ProjectBuilder.java

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,8 @@ private Project createJbangProject(ResourceRef resourceRef) {
338338

339339
SourceSet ss = prj.getMainSourceSet();
340340
ss.addResources(allToFileRef(directives.files(), resourceRef, sibRes1));
341-
ss.addDependencies(directives.binaryDependencies());
341+
ss.addDependencies(DependencyUtil.filterGavDeps(directives.dependencies()));
342+
ss.addClassPaths(DependencyUtil.filterJarDeps(directives.dependencies()));
342343
ss.addCompileOptions(directives.compileOptions());
343344
ss.addNativeOptions(directives.nativeOptions());
344345
prj.addRepositories(directives.repositories());
@@ -362,10 +363,7 @@ private Project createJbangProject(ResourceRef resourceRef) {
362363

363364
ResourceResolver resolver = getAliasResourceResolver(null);
364365
ResourceResolver sibRes2 = getSiblingResolver(resourceRef, resolver);
365-
for (String srcDep : directives.sourceDependencies()) {
366-
ResourceRef subRef = resolver.resolve(srcDep, true);
367-
prj.addSubProject(new ProjectBuilder(buildRefs).build(subRef));
368-
}
366+
handleSourceDeps(DependencyUtil.filterSourceDeps(directives.dependencies()), resolver, prj);
369367

370368
boolean first = true;
371369
List<String> sources = directives.sources();
@@ -397,6 +395,20 @@ private Project createJbangProject(ResourceRef resourceRef) {
397395
return updateProject(prj);
398396
}
399397

398+
private void handleSourceDeps(List<String> srcDeps, ResourceResolver resolver, Project prj) {
399+
for (String srcDep : srcDeps) {
400+
ResourceRef subRef = resolver.resolve(srcDep, true);
401+
Project subPrj;
402+
if (subRef != null) {
403+
subPrj = new ProjectBuilder(buildRefs).build(subRef);
404+
} else {
405+
subPrj = new Project(ResourceRef.forUnresolvable(srcDep,
406+
"Could not be resolved from " + resolver.description()));
407+
}
408+
prj.addSubProject(subPrj);
409+
}
410+
}
411+
400412
private Project createSourceProject(ResourceRef resourceRef) {
401413
Source src = createSource(resourceRef);
402414
Project prj = new Project(src);
@@ -657,7 +669,8 @@ private Project updateProject(Source src, Project prj, ResourceResolver resolver
657669
}
658670
ResourceResolver sibRes1 = getSiblingResolver(srcRef);
659671
ss.addResources(allToFileRef(src.getDirectives().files(), srcRef, sibRes1));
660-
ss.addDependencies(src.collectBinaryDependencies());
672+
ss.addDependencies(DependencyUtil.filterGavDeps(src.collectDependencies()));
673+
ss.addClassPaths(DependencyUtil.filterJarDeps(src.collectDependencies()));
661674
ss.addCompileOptions(src.getCompileOptions());
662675
ss.addNativeOptions(src.getNativeOptions());
663676
prj.addRepositories(src.getDirectives().repositories());
@@ -680,10 +693,7 @@ private Project updateProject(Source src, Project prj, ResourceResolver resolver
680693
prj.setJavaVersion(version);
681694
}
682695
}
683-
for (String srcDep : src.collectSourceDependencies()) {
684-
ResourceRef subRef = sibRes1.resolve(srcDep, true);
685-
prj.addSubProject(new ProjectBuilder(buildRefs).build(subRef));
686-
}
696+
handleSourceDeps(DependencyUtil.filterSourceDeps(src.collectDependencies()), sibRes1, prj);
687697
ResourceResolver sibRes2 = getSiblingResolver(srcRef, resolver);
688698
List<Source> includedSources = allToSource(src.getDirectives().sources(), srcRef, sibRes2);
689699
for (Source includedSource : includedSources) {

src/main/java/dev/jbang/source/Source.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,12 +83,8 @@ protected String getContents() {
8383

8484
public abstract @NonNull Type getType();
8585

86-
protected List<String> collectBinaryDependencies() {
87-
return getDirectives().binaryDependencies();
88-
}
89-
90-
protected List<String> collectSourceDependencies() {
91-
return getDirectives().sourceDependencies();
86+
protected List<String> collectDependencies() {
87+
return getDirectives().dependencies();
9288
}
9389

9490
protected abstract List<String> getCompileOptions();

src/main/java/dev/jbang/source/parser/Directives.java

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import org.jspecify.annotations.Nullable;
2121

2222
import dev.jbang.dependencies.DependencyUtil;
23-
import dev.jbang.dependencies.JitPackUtil;
2423
import dev.jbang.dependencies.MavenCoordinate;
2524
import dev.jbang.dependencies.MavenRepo;
2625
import dev.jbang.util.JavaUtil;
@@ -56,32 +55,18 @@ public abstract static class Names {
5655

5756
public abstract Stream<Directive> getAll();
5857

59-
public List<String> binaryDependencies() {
58+
public List<String> dependencies() {
6059
return getAll()
6160
.filter(this::isDependDeclare)
6261
.map(Directive::getValue)
6362
.flatMap(v -> quotedStringToList(Q2TL_SSCT, v).stream())
64-
.filter(Directives::isGav)
65-
.collect(Collectors.toList());
66-
}
67-
68-
public List<String> sourceDependencies() {
69-
return getAll()
70-
.filter(this::isDependDeclare)
71-
.map(Directive::getValue)
72-
.flatMap(v -> quotedStringToList(Q2TL_SSCT, v).stream())
73-
.filter(it -> !isGav(it))
7463
.collect(Collectors.toList());
7564
}
7665

7766
protected boolean isDependDeclare(Directive d) {
7867
return Names.DEPS.equals(d.getName());
7968
}
8069

81-
private static boolean isGav(String ref) {
82-
return DependencyUtil.looksLikeAPossibleGav(ref) || !JitPackUtil.ensureGAV(ref).equals(ref);
83-
}
84-
8570
public List<MavenRepo> repositories() {
8671
return getAll()
8772
.filter(this::isRepoDeclare)

src/main/java/dev/jbang/source/sources/GroovySource.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ protected List<String> getRuntimeOptions() {
4747
}
4848

4949
@Override
50-
protected List<String> collectBinaryDependencies() {
51-
final List<String> allDependencies = super.collectBinaryDependencies();
50+
protected List<String> collectDependencies() {
51+
final List<String> allDependencies = super.collectDependencies();
5252
final String groovyVersion = getGroovyVersion();
5353
if (groovyVersion.startsWith("4.") || groovyVersion.startsWith("5.")) {
5454
allDependencies.add("org.apache.groovy:groovy:" + groovyVersion);

src/main/java/dev/jbang/source/sources/KotlinSource.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ public KotlinSource(ResourceRef script, Function<String, String> replaceProperti
3030
}
3131

3232
@Override
33-
protected List<String> collectBinaryDependencies() {
34-
final List<String> allDependencies = super.collectBinaryDependencies();
33+
protected List<String> collectDependencies() {
34+
final List<String> allDependencies = super.collectDependencies();
3535
allDependencies.add("org.jetbrains.kotlin:kotlin-stdlib:" + getKotlinVersion());
3636
return allDependencies;
3737
}

0 commit comments

Comments
 (0)