diff --git a/classes/META-INF/MANIFEST.MF b/classes/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..4512657
--- /dev/null
+++ b/classes/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Created-By: 17.0.12 (Eclipse Adoptium)
+
diff --git a/classes/dev/mccue/tree/Tree.class b/classes/dev/mccue/tree/Tree.class
new file mode 100644
index 0000000..77d34f1
Binary files /dev/null and b/classes/dev/mccue/tree/Tree.class differ
diff --git a/classes/module-info.class b/classes/module-info.class
new file mode 100644
index 0000000..647decb
Binary files /dev/null and b/classes/module-info.class differ
diff --git a/src/test/java/rife/bld/operations/TestJlinkOperation.java b/src/test/java/rife/bld/operations/TestJlinkOperation.java
index 7845508..c47f02f 100644
--- a/src/test/java/rife/bld/operations/TestJlinkOperation.java
+++ b/src/test/java/rife/bld/operations/TestJlinkOperation.java
@@ -7,9 +7,12 @@ package rife.bld.operations;
import org.junit.jupiter.api.Test;
import rife.bld.operations.exceptions.ExitStatusException;
+import rife.tools.FileUtils;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
import java.util.HashMap;
-import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
@@ -68,8 +71,27 @@ public class TestJlinkOperation {
.disablePlugin("system-modules")
.listPlugins();
assertDoesNotThrow(jlink::execute);
+ }
- assertTrue(jlink.toolArgs().containsAll(List.of("vm", "system-modules")));
+ @Test
+ void testExecute() throws IOException {
+ var tmpdir = Files.createTempDirectory("bld-jlink-test").toFile();
+ tmpdir.deleteOnExit();
+
+ var output = new File(tmpdir, "jlink");
+ output.deleteOnExit();
+
+ var options = new JlinkOptions()
+ .modulePath("src/test/resources/jlink/build/jmod")
+ .addModules("dev.mccue.tree")
+ .launcher("tree", "dev.mccue.tree", "dev.mccue.tree.Tree")
+ .output(output.getAbsolutePath());
+ var jlink = new JlinkOperation().jlinkOptions(options);
+
+ assertDoesNotThrow(jlink::execute);
+ assertTrue(output.exists(), "Output dir does not exist");
+
+ FileUtils.deleteDirectory(tmpdir);
}
@Test
@@ -88,7 +110,7 @@ public class TestJlinkOperation {
@Test
void testOptions() {
- var jlink = new JlinkOperation().options("src/test/resources/options_verbose.txt");
+ var jlink = new JlinkOperation().options("src/test/resources/jlink/options_verbose.txt");
assertDoesNotThrow(jlink::execute);
}
diff --git a/src/test/java/rife/bld/operations/TestJmodOperation.java b/src/test/java/rife/bld/operations/TestJmodOperation.java
index 1dbbfaa..aa4550b 100644
--- a/src/test/java/rife/bld/operations/TestJmodOperation.java
+++ b/src/test/java/rife/bld/operations/TestJmodOperation.java
@@ -7,12 +7,17 @@ package rife.bld.operations;
import org.junit.jupiter.api.Test;
import rife.bld.operations.exceptions.ExitStatusException;
+import rife.tools.FileUtils;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.HashMap;
import static org.junit.jupiter.api.Assertions.*;
+import static rife.bld.operations.JmodOperation.OperationMode;
public class TestJmodOperation {
@Test
@@ -68,10 +73,60 @@ public class TestJmodOperation {
}
}
+ @Test
+ void testCreate() throws IOException {
+ var tmpdir = Files.createTempDirectory("bld-jmod-test").toFile();
+ tmpdir.deleteOnExit();
+
+ var mod = new File(tmpdir, "dev.mccue.tree.jmod");
+ mod.deleteOnExit();
+
+ var options = new JmodOptions()
+ .legalNotices("src/test/resources/jlink/dev.mccue.apple/legal")
+ .classpath("src/test/resources/jlink/build/jar/dev.mccue.apple.jar");
+ var jmod = new JmodOperation()
+ .operationMode(OperationMode.CREATE)
+ .jmodFile(mod.getAbsolutePath())
+ .jmodOptions(options);
+
+ assertDoesNotThrow(jmod::execute);
+ assertTrue(mod.exists(), "mod does not exist");
+
+ FileUtils.deleteDirectory(tmpdir);
+ }
+
+ @Test
+ void testExecute() throws IOException {
+ var tmpdir = Files.createTempDirectory("bld-jmod-test").toFile();
+ tmpdir.deleteOnExit();
+
+ var mod = new File(tmpdir, "dev.mccue.tree.jmod");
+ mod.deleteOnExit();
+
+ var options = new JmodOptions().classpath("src/test/resources/jlink/build/jar/dev.mccue.tree.jar");
+ var jmod = new JmodOperation()
+ .operationMode(OperationMode.CREATE)
+ .jmodFile(mod.getAbsolutePath())
+ .jmodOptions(options);
+
+ assertDoesNotThrow(jmod::execute);
+ assertTrue(mod.exists(), "mod does not exist");
+
+ jmod.jmodOptions().clear();
+
+ jmod.operationMode(OperationMode.DESCRIBE);
+ assertDoesNotThrow(jmod::execute, "describe mod failed");
+
+ jmod.operationMode(OperationMode.LIST);
+ assertDoesNotThrow(jmod::execute, "list mod failed");
+
+ FileUtils.deleteDirectory(tmpdir);
+ }
+
@Test
void testHelp() {
var jmod = new JmodOperation()
- .operationMode(JmodOperation.OperationMode.HASH)
+ .operationMode(OperationMode.HASH)
.jmodFile("foo")
.addArgs("--help-extra");
assertDoesNotThrow(jmod::execute);
@@ -87,14 +142,14 @@ public class TestJmodOperation {
@Test
void testOptions() {
- var jpackage = new JpackageOperation().options("src/test/resources/options_version.txt");
+ var jpackage = new JpackageOperation().options("src/test/resources/jlink/options_version.txt");
assertDoesNotThrow(jpackage::execute);
}
@Test
void testVersion() {
var jmod = new JmodOperation()
- .operationMode(JmodOperation.OperationMode.DESCRIBE)
+ .operationMode(OperationMode.DESCRIBE)
.jmodFile("foo")
.addArgs("--version");
assertDoesNotThrow(jmod::execute);
diff --git a/src/test/java/rife/bld/operations/TestJpackageOperation.java b/src/test/java/rife/bld/operations/TestJpackageOperation.java
index 8a1178b..4c32c01 100644
--- a/src/test/java/rife/bld/operations/TestJpackageOperation.java
+++ b/src/test/java/rife/bld/operations/TestJpackageOperation.java
@@ -13,6 +13,8 @@ import java.nio.file.Files;
import java.util.HashMap;
import static org.junit.jupiter.api.Assertions.*;
+import static rife.bld.operations.JpackageOptions.Launcher;
+import static rife.bld.operations.JpackageOptions.PackageType;
public class TestJpackageOperation {
@@ -82,7 +84,7 @@ public class TestJpackageOperation {
var options = new JpackageOptions()
.aboutUrl(args.get("--about-url"))
- .addLauncher(new JpackageOptions.Launcher("name", "path"))
+ .addLauncher(new Launcher("name", "path"))
.addModules(args.get("--add-modules").split(","))
.appContent(args.get("--app-content").split(","))
.appImage(args.get("--app-image"))
@@ -128,7 +130,7 @@ public class TestJpackageOperation {
.runtimeImage(args.get("--runtime-image"))
.stripDebug(true)
.temp(args.get("--temp"))
- .type(JpackageOptions.PackageType.EXE)
+ .type(PackageType.EXE)
.vendor(args.get("--vendor"))
.verbose(true)
.winConsole(true)
@@ -166,7 +168,7 @@ public class TestJpackageOperation {
var os = System.getProperty("os.version");
if (os.endsWith("MANJARO")) {
- options.type(JpackageOptions.PackageType.DEB);
+ options.type(PackageType.DEB);
}
var jpackage = new JpackageOperation().jpackageOptions(options);
@@ -197,7 +199,7 @@ public class TestJpackageOperation {
@Test
void testOptions() {
- var jpackage = new JpackageOperation().options("src/test/resources/options_verbose.txt");
+ var jpackage = new JpackageOperation().options("src/test/resources/jlink/options_verbose.txt");
assertDoesNotThrow(jpackage::execute);
}
diff --git a/src/test/resources/jlink/.gitignore b/src/test/resources/jlink/.gitignore
new file mode 100644
index 0000000..edea9d9
--- /dev/null
+++ b/src/test/resources/jlink/.gitignore
@@ -0,0 +1,2 @@
+build/javac
+build/jar
\ No newline at end of file
diff --git a/src/test/resources/jlink/Makefile b/src/test/resources/jlink/Makefile
new file mode 100644
index 0000000..c7f0557
--- /dev/null
+++ b/src/test/resources/jlink/Makefile
@@ -0,0 +1,40 @@
+.PHONY: clean
+clean:
+ rm -rf build
+
+.PHONY: compile
+compile: clean
+ javac -d build/javac --module-source-path "./*/src" --module dev.mccue.tree,dev.mccue.apple
+
+.PHONY: package
+package: compile
+ mkdir -p build/jar
+
+ jar --create --file build/jar/dev.mccue.apple.jar \
+ -C build/javac/dev.mccue.apple . \
+ -C dev.mccue.apple/res .
+ jar --create --file build/jar/dev.mccue.tree.jar \
+ -C build/javac/dev.mccue.tree .
+
+.PHONY: link
+link: package
+ mkdir -p build/jmod
+
+ jmod create \
+ --legal-notices dev.mccue.apple/legal \
+ --class-path build/jar/dev.mccue.apple.jar \
+ build/jmod/dev.mccue.apple.jmod
+
+ jmod create \
+ --class-path build/jar/dev.mccue.tree.jar \
+ build/jmod/dev.mccue.tree.jmod
+
+ jlink \
+ --module-path build/jmod \
+ --add-modules dev.mccue.tree \
+ --launcher tree=dev.mccue.tree/dev.mccue.tree.Tree \
+ --output build/jlink
+
+.PHONY: test
+test: link
+ ./build/jlink/bin/tree
diff --git a/src/test/resources/jlink/dev.mccue.apple/dev.mccue.apple.iml b/src/test/resources/jlink/dev.mccue.apple/dev.mccue.apple.iml
new file mode 100644
index 0000000..c90834f
--- /dev/null
+++ b/src/test/resources/jlink/dev.mccue.apple/dev.mccue.apple.iml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/test/resources/jlink/dev.mccue.apple/legal/LICENSE b/src/test/resources/jlink/dev.mccue.apple/legal/LICENSE
new file mode 100644
index 0000000..6a332dd
--- /dev/null
+++ b/src/test/resources/jlink/dev.mccue.apple/legal/LICENSE
@@ -0,0 +1 @@
+Apples are GOD'S creation. You have no right to them.
\ No newline at end of file
diff --git a/src/test/resources/jlink/dev.mccue.apple/res/dev/mccue/apple/color.txt b/src/test/resources/jlink/dev.mccue.apple/res/dev/mccue/apple/color.txt
new file mode 100644
index 0000000..46f29e8
--- /dev/null
+++ b/src/test/resources/jlink/dev.mccue.apple/res/dev/mccue/apple/color.txt
@@ -0,0 +1 @@
+red
\ No newline at end of file
diff --git a/src/test/resources/jlink/dev.mccue.apple/src/dev/mccue/apple/Apple.java b/src/test/resources/jlink/dev.mccue.apple/src/dev/mccue/apple/Apple.java
new file mode 100644
index 0000000..8afbc8b
--- /dev/null
+++ b/src/test/resources/jlink/dev.mccue.apple/src/dev/mccue/apple/Apple.java
@@ -0,0 +1,20 @@
+package dev.mccue.apple;
+
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.util.Objects;
+
+public final class Apple {
+ public String color() {
+ try {
+ return new String(
+ Objects.requireNonNull(
+ Apple.class.getResourceAsStream("/dev/mccue/apple/color.txt")
+ ).readAllBytes()
+ );
+ } catch (IOException e) {
+ throw new UncheckedIOException(e);
+ }
+
+ }
+}
diff --git a/src/test/resources/jlink/dev.mccue.apple/src/module-info.java b/src/test/resources/jlink/dev.mccue.apple/src/module-info.java
new file mode 100644
index 0000000..1e2b64b
--- /dev/null
+++ b/src/test/resources/jlink/dev.mccue.apple/src/module-info.java
@@ -0,0 +1,3 @@
+module dev.mccue.apple {
+ exports dev.mccue.apple;
+}
\ No newline at end of file
diff --git a/src/test/resources/jlink/dev.mccue.tree/dev.mccue.tree.iml b/src/test/resources/jlink/dev.mccue.tree/dev.mccue.tree.iml
new file mode 100644
index 0000000..3dcb8cc
--- /dev/null
+++ b/src/test/resources/jlink/dev.mccue.tree/dev.mccue.tree.iml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/test/resources/jlink/dev.mccue.tree/src/dev/mccue/tree/Tree.java b/src/test/resources/jlink/dev.mccue.tree/src/dev/mccue/tree/Tree.java
new file mode 100644
index 0000000..aa8ebe9
--- /dev/null
+++ b/src/test/resources/jlink/dev.mccue.tree/src/dev/mccue/tree/Tree.java
@@ -0,0 +1,15 @@
+package dev.mccue.tree;
+
+import dev.mccue.apple.Apple;
+
+public final class Tree {
+ public Apple bearFruit() {
+ return new Apple();
+ }
+
+ public static void main(String[] args) {
+ System.out.println(
+ new Tree().bearFruit().color()
+ );
+ }
+}
diff --git a/src/test/resources/jlink/dev.mccue.tree/src/module-info.java b/src/test/resources/jlink/dev.mccue.tree/src/module-info.java
new file mode 100644
index 0000000..e481ad5
--- /dev/null
+++ b/src/test/resources/jlink/dev.mccue.tree/src/module-info.java
@@ -0,0 +1,3 @@
+module dev.mccue.tree {
+ requires dev.mccue.apple;
+}
\ No newline at end of file
diff --git a/src/test/resources/options_verbose.txt b/src/test/resources/jlink/options_verbose.txt
similarity index 100%
rename from src/test/resources/options_verbose.txt
rename to src/test/resources/jlink/options_verbose.txt
diff --git a/src/test/resources/options_version.txt b/src/test/resources/jlink/options_version.txt
similarity index 100%
rename from src/test/resources/options_version.txt
rename to src/test/resources/jlink/options_version.txt