Skip to content

Commit f466fbc

Browse files
authored
Merge pull request #80
feat: adds support for cli maven dependencies
2 parents d9cfd54 + 94b6492 commit f466fbc

File tree

8 files changed

+213
-6
lines changed

8 files changed

+213
-6
lines changed

plugins/avro-schema-compiler/src/main/java/io/zenwave360/sdk/plugins/AvroSchemaLoader.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import java.io.File;
1313
import java.io.IOException;
1414
import java.net.URI;
15+
import java.net.URLClassLoader;
1516
import java.nio.file.Files;
1617
import java.nio.file.Path;
1718
import java.nio.file.Paths;
@@ -118,9 +119,15 @@ protected List<URI> collectAvscFiles(File sourceFolder, List<String> imports, Li
118119
log.trace("Scanning classpath package for .avsc files: {}", packagePath);
119120
try {
120121
ConfigurationBuilder config = new ConfigurationBuilder()
121-
.forPackage(packagePath.replace("/", "."))
122122
.setScanners(Scanners.Resources);
123123

124+
if (this.projectClassLoader instanceof URLClassLoader urlClassLoader) {
125+
config.addClassLoaders(urlClassLoader);
126+
config.addUrls(urlClassLoader.getURLs());
127+
} else {
128+
config.forPackage(packagePath.replace("/", "."));
129+
}
130+
124131
Set<String> avscResources = new Reflections(config).getResources(Pattern.compile(".*\\.avsc"));
125132

126133
// Apply package filtering as a safety net (handles current Reflections bug)

pom.xml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,17 @@
5353

5454
<slf4j-api.version>1.7.36</slf4j-api.version>
5555
<picocli.version>4.6.3</picocli.version>
56+
<jbang-core.version>RELEASE</jbang-core.version>
5657
<reflections.version>0.10.2</reflections.version>
5758
<handlebars-java.version>4.3.1</handlebars-java.version>
5859
<json-path.version>2.9.0</json-path.version>
5960
<json-schema-ref-parser-jvm.version>0.9.5</json-schema-ref-parser-jvm.version>
6061
<zdl-jvm.version>1.3.0</zdl-jvm.version>
6162
<graphql-java.version>19.2</graphql-java.version>
62-
<google-java-format.version>1.25.2</google-java-format.version>
63-
<palantir-java-format.version>2.55.0</palantir-java-format.version>
64-
<spring-javaformat.version>0.0.39</spring-javaformat.version>
65-
<ktfmt.version>0.54</ktfmt.version>
63+
<google-java-format.version>1.32.0</google-java-format.version>
64+
<palantir-java-format.version>2.82.0</palantir-java-format.version>
65+
<spring-javaformat.version>0.0.47</spring-javaformat.version>
66+
<ktfmt.version>0.59</ktfmt.version>
6667
<junit.version>5.10.1</junit.version>
6768
<spring-boot-dependencies.version>3.4.3</spring-boot-dependencies.version>
6869
<reflections.version>0.10.2</reflections.version>

zenwave-sdk-cli/pom.xml

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,58 @@
2020
<artifactId>reflections</artifactId>
2121
<version>${reflections.version}</version>
2222
</dependency>
23+
<dependency>
24+
<groupId>dev.jbang</groupId>
25+
<artifactId>jbang-cli</artifactId>
26+
<version>${jbang-core.version}</version>
27+
<!-- <scope>provided</scope>-->
28+
<exclusions>
29+
<exclusion>
30+
<groupId>org.slf4j</groupId>
31+
<artifactId>*</artifactId>
32+
</exclusion>
33+
<exclusion>
34+
<groupId>dev.jbang</groupId>
35+
<artifactId>devkitman</artifactId>
36+
</exclusion>
37+
<exclusion>
38+
<groupId>io.quarkus.qute</groupId>
39+
<artifactId>qute-core</artifactId>
40+
</exclusion>
41+
<exclusion>
42+
<groupId>org.codehaus.plexus</groupId>
43+
<artifactId>plexus-java</artifactId>
44+
</exclusion>
45+
<exclusion>
46+
<groupId>org.jsoup</groupId>
47+
<artifactId>jsoup</artifactId>
48+
</exclusion>
49+
<exclusion>
50+
<groupId>org.jspecify</groupId>
51+
<artifactId>jspecify</artifactId>
52+
</exclusion>
53+
<exclusion>
54+
<groupId>org.jboss</groupId>
55+
<artifactId>jandex</artifactId>
56+
</exclusion>
57+
<exclusion>
58+
<groupId>org.codejive</groupId>
59+
<artifactId>java-properties</artifactId>
60+
</exclusion>
61+
<exclusion>
62+
<groupId>org.apache.commons</groupId>
63+
<artifactId>commons-text</artifactId>
64+
</exclusion>
65+
<exclusion>
66+
<groupId>org.apache.commons</groupId>
67+
<artifactId>commons-compress</artifactId>
68+
</exclusion>
69+
<exclusion>
70+
<groupId>eu.maveniverse.maven.nisse</groupId>
71+
<artifactId>sources</artifactId>
72+
</exclusion>
73+
</exclusions>
74+
</dependency>
2375
<dependency>
2476
<groupId>com.github.jknack</groupId>
2577
<artifactId>handlebars</artifactId>

zenwave-sdk-cli/src/main/java/io/zenwave360/sdk/Main.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import java.util.Map;
77
import java.util.concurrent.Callable;
88

9+
import io.zenwave360.sdk.utils.MavenLoader;
910
import org.apache.commons.lang3.StringUtils;
1011
import org.slf4j.Logger;
1112
import org.slf4j.LoggerFactory;
@@ -26,6 +27,12 @@ public class Main implements Callable<Integer> {
2627
@Option(names = {"-p", "--plugin"}, arity = "0..1", description = "Plugin Class or short-code")
2728
String pluginClass;
2829

30+
@Option(names = {"-d", "--deps"}, arity = "0..1", description = "Dependencies to include in classpath")
31+
List<String> deps;
32+
33+
@Option(names = {"-r", "--repos"}, arity = "0..1", description = "Repositories to search for extra dependencies")
34+
List<String> repos;
35+
2936
@Option(names = {"-f", "--force"}, description = "Force overwrite", defaultValue = "false")
3037
boolean forceOverwrite = false;
3138

@@ -65,6 +72,7 @@ public static void main(String... args) {
6572

6673
@Override
6774
public Integer call() throws Exception {
75+
6876
if(forceOverwrite) {
6977
options.put("forceOverwrite", true);
7078
}
@@ -81,6 +89,7 @@ public Integer call() throws Exception {
8189
.withZdlFiles(split(options.get("zdlFiles")))
8290
.withTargetFolder((String) options.get("targetFolder"))
8391
.withForceOverwrite(forceOverwrite)
92+
.withProjectClassLoader(MavenLoader.loadJBangDependencies(deps, repos))
8493
.withOptions(options);
8594
new MainGenerator().generate(plugin);
8695
return 0;

zenwave-sdk-cli/src/main/java/io/zenwave360/sdk/Plugin.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ public class Plugin {
5454
private ClassLoader projectClassLoader;
5555

5656
public static Plugin of(String pluginConfigAsString) throws Exception {
57-
System.out.println("of: " + pluginConfigAsString);
5857
if (pluginConfigAsString != null) {
5958
if (pluginConfigAsString.contains(".")) {
6059
return (Plugin) Plugin.class.getClassLoader().loadClass(pluginConfigAsString).getDeclaredConstructor().newInstance();
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package io.zenwave360.sdk.utils;
2+
3+
import dev.jbang.dependencies.DependencyUtil;
4+
import dev.jbang.dependencies.MavenRepo;
5+
import org.slf4j.Logger;
6+
import org.slf4j.LoggerFactory;
7+
8+
import java.io.File;
9+
import java.net.MalformedURLException;
10+
import java.net.URL;
11+
import java.net.URLClassLoader;
12+
import java.util.ArrayList;
13+
import java.util.List;
14+
15+
public class MavenLoader {
16+
17+
private static Logger log = LoggerFactory.getLogger(MavenLoader.class);
18+
19+
public static URLClassLoader loadJBangDependencies(List<String> dependencies, List<String> repos) {
20+
if (dependencies == null || dependencies.isEmpty()) {
21+
return null;
22+
}
23+
log.info("Loading {} dependencies: {}", dependencies.size(), dependencies);
24+
var urls = findJBangDependencies(dependencies, repos);
25+
log.info("Found {} urls: {}", urls.size(), urls);
26+
return new URLClassLoader(
27+
urls.toArray(new URL[0]),
28+
Thread.currentThread().getContextClassLoader()
29+
);
30+
}
31+
32+
public static List<URL> findJBangDependencies(List<String> dependencies, List<String> repos) {
33+
List<MavenRepo> mavenRepos = new ArrayList<>();
34+
if (repos != null) {
35+
mavenRepos.addAll(repos.stream().map(repo -> new MavenRepo(repo, repo)).toList());
36+
}
37+
mavenRepos.add(new MavenRepo("central", "https://repo1.maven.org/maven2/"));
38+
mavenRepos.add(new MavenRepo("snapshots", "https://s01.oss.sonatype.org/content/repositories/snapshots/"));
39+
40+
// TODO: Resolve dependencies urls using JBang dependency resolver
41+
var modularClassPath = DependencyUtil.resolveDependencies(dependencies, mavenRepos, false, false, false, false, false);
42+
List<String> files = modularClassPath.getClassPaths();
43+
List<URL> urls = files.stream().map(f -> {
44+
try {
45+
return new File(f).toURI().toURL();
46+
} catch (MalformedURLException e) {
47+
throw new RuntimeException(e);
48+
}
49+
}).toList();
50+
return urls;
51+
}
52+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package io.zenwave360.sdk.utils;
2+
3+
import org.junit.jupiter.api.Assertions;
4+
import org.junit.jupiter.api.Test;
5+
6+
import java.net.URL;
7+
import java.net.URLClassLoader;
8+
import java.util.ArrayList;
9+
import java.util.List;
10+
11+
public class MavenLoaderTest {
12+
13+
@Test
14+
void testFindJBangDependencies() {
15+
// Given
16+
List<String> dependencies = List.of("org.apache.commons:commons-lang3:3.12.0");
17+
List<String> repos = List.of("https://repo1.maven.org/maven2/");
18+
19+
// When
20+
List<URL> urls = MavenLoader.findJBangDependencies(dependencies, repos);
21+
22+
// Then
23+
Assertions.assertNotNull(urls);
24+
Assertions.assertFalse(urls.isEmpty());
25+
Assertions.assertTrue(urls.stream().anyMatch(url -> url.toString().contains("commons-lang3")));
26+
}
27+
28+
@Test
29+
void testFindJBangLocalDependencies() {
30+
// Given
31+
List<String> dependencies = List.of("io.example.asyncapi.shoppingcart:shopping-cart-apis:1.0.0");
32+
33+
// When
34+
List<URL> urls = MavenLoader.findJBangDependencies(dependencies, null);
35+
36+
// Then
37+
Assertions.assertNotNull(urls);
38+
Assertions.assertFalse(urls.isEmpty());
39+
Assertions.assertTrue(urls.stream().anyMatch(url -> url.toString().contains("shopping-cart-apis")));
40+
}
41+
42+
43+
@Test
44+
void testFindJBangDependenciesWithNullRepos() {
45+
// Given
46+
List<String> dependencies = List.of("org.apache.commons:commons-lang3:3.12.0");
47+
48+
// When
49+
List<URL> urls = MavenLoader.findJBangDependencies(dependencies, null);
50+
51+
// Then
52+
Assertions.assertNotNull(urls);
53+
Assertions.assertFalse(urls.isEmpty());
54+
}
55+
56+
@Test
57+
void testLoadJBangDependencies() {
58+
// Given
59+
List<String> dependencies = List.of("org.apache.commons:commons-lang3:3.12.0");
60+
List<String> repos = List.of("https://repo1.maven.org/maven2/");
61+
62+
// When
63+
MavenLoader.loadJBangDependencies(dependencies, repos);
64+
65+
// Then
66+
ClassLoader currentClassLoader = Thread.currentThread().getContextClassLoader();
67+
Assertions.assertInstanceOf(URLClassLoader.class, currentClassLoader);
68+
}
69+
70+
@Test
71+
void testLoadJBangDependenciesWithEmptyLists() {
72+
// Given
73+
List<String> dependencies = new ArrayList<>();
74+
List<String> repos = new ArrayList<>();
75+
76+
// When & Then - should not throw exception
77+
Assertions.assertDoesNotThrow(() ->
78+
MavenLoader.loadJBangDependencies(dependencies, repos)
79+
);
80+
}
81+
}

zenwave-sdk-maven-plugin/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,12 @@
4545
<groupId>${project.groupId}</groupId>
4646
<artifactId>zenwave-sdk-cli</artifactId>
4747
<version>${project.version}</version>
48+
<exclusions>
49+
<exclusion>
50+
<groupId>dev.jbang</groupId>
51+
<artifactId>*</artifactId>
52+
</exclusion>
53+
</exclusions>
4854
</dependency>
4955

5056
<dependency>

0 commit comments

Comments
 (0)