diff --git a/common/src/main/java/net/woggioni/envelope/Constants.java b/common/src/main/java/net/woggioni/envelope/Constants.java index a82ff1b..4b19820 100644 --- a/common/src/main/java/net/woggioni/envelope/Constants.java +++ b/common/src/main/java/net/woggioni/envelope/Constants.java @@ -13,6 +13,7 @@ public class Constants { public static final String DEFAULT_LAUNCHER = "net.woggioni.envelope.Launcher"; public static final String AGENT_LAUNCHER = "net.woggioni.envelope.JavaAgentLauncher"; public static final String JAVA_AGENTS_FILE = METADATA_FOLDER + "/javaAgents.properties"; + public static final String SYSTEM_PROPERTIES_FILE = METADATA_FOLDER + "/system.properties"; public static class ManifestAttributes { public static final String MAIN_MODULE = "Executable-Jar-Main-Module"; diff --git a/gradle.properties b/gradle.properties index 0f81f90..4a2d429 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,9 +1,9 @@ woggioniMavenRepositoryUrl=https://woggioni.net/mvn/ publishMavenRepositoryUrl=https://mvn.woggioni.net/ -version.envelope=0.1 +version.envelope=1.0-SNAPSHOT version.gradle=7.4 version.lombok=1.18.22 -version.xclassloader=1.0 +version.xclassloader=1.0-SNAPSHOT version.junitJupiter=5.7.2 -version.junitPlatform=1.7.0 \ No newline at end of file +version.junitPlatform=1.7.0 diff --git a/launcher/src/main/java/net/woggioni/envelope/Launcher.java b/launcher/src/main/java/net/woggioni/envelope/Launcher.java index ff40601..25e035c 100644 --- a/launcher/src/main/java/net/woggioni/envelope/Launcher.java +++ b/launcher/src/main/java/net/woggioni/envelope/Launcher.java @@ -1,7 +1,6 @@ package net.woggioni.envelope; import lombok.SneakyThrows; -import lombok.extern.java.Log; import java.io.InputStream; import java.lang.reflect.Method; @@ -16,7 +15,9 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.Properties; import java.util.function.Function; import java.util.jar.Attributes; import java.util.jar.JarFile; @@ -26,7 +27,6 @@ import java.util.stream.Stream; import java.util.stream.StreamSupport; -@Log public class Launcher { @SneakyThrows @@ -41,6 +41,19 @@ public class Launcher { @SneakyThrows public static void main(String[] args) { + Enumeration it = Launcher.class.getClassLoader().getResources(Constants.SYSTEM_PROPERTIES_FILE); + while (it.hasMoreElements()) { + URL url = it.nextElement(); + Properties properties = new Properties(); + try (InputStream is = url.openStream()) { + properties.load(is); + } + for (Map.Entry entry : properties.entrySet()) { + String key = (String) entry.getKey(); + String value = (String) entry.getValue(); + if(System.getProperty(key) == null) System.setProperty(key, value); + } + } URI currentJar = findCurrentJar(); String currentJarPath = currentJar.getPath(); URL manifestResource = null; diff --git a/settings.gradle b/settings.gradle index 92e1ad3..c16eea8 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,6 +1,12 @@ pluginManagement { repositories { maven { + content { + includeModule 'net.woggioni.gradle', 'lombok' + includeModule 'net.woggioni.gradle.lombok', 'net.woggioni.gradle.lombok.gradle.plugin' + includeModule 'net.woggioni.gradle', 'multi-release-jar' + includeModule 'net.woggioni.gradle.multi-release-jar', 'net.woggioni.gradle.multi-release-jar.gradle.plugin' + } url = 'https://woggioni.net/mvn/' } } diff --git a/src/main/java/net/woggioni/gradle/envelope/EnvelopeJarTask.java b/src/main/java/net/woggioni/gradle/envelope/EnvelopeJarTask.java index 326fe54..bdb8b2f 100644 --- a/src/main/java/net/woggioni/gradle/envelope/EnvelopeJarTask.java +++ b/src/main/java/net/woggioni/gradle/envelope/EnvelopeJarTask.java @@ -1,23 +1,5 @@ package net.woggioni.gradle.envelope; -import java.io.File; -import java.io.InputStream; -import java.security.MessageDigest; -import java.util.Base64; -import java.util.Collections; -import java.util.Map; -import java.util.Objects; -import java.util.Properties; -import java.util.Set; -import java.util.function.Supplier; -import java.util.jar.Attributes; -import java.util.jar.JarFile; -import java.util.jar.Manifest; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; -import java.util.zip.ZipOutputStream; -import javax.annotation.Nonnull; -import javax.inject.Inject; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; @@ -38,6 +20,25 @@ import org.gradle.api.tasks.WorkResult; import org.gradle.api.tasks.bundling.AbstractArchiveTask; import org.gradle.util.GradleVersion; +import javax.annotation.Nonnull; +import javax.inject.Inject; +import java.io.File; +import java.io.InputStream; +import java.security.MessageDigest; +import java.util.Base64; +import java.util.Collections; +import java.util.Map; +import java.util.Objects; +import java.util.Properties; +import java.util.Set; +import java.util.TreeMap; +import java.util.function.Supplier; +import java.util.jar.Attributes; +import java.util.jar.JarFile; +import java.util.jar.Manifest; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; +import java.util.zip.ZipOutputStream; import static java.util.zip.Deflater.BEST_COMPRESSION; import static java.util.zip.Deflater.NO_COMPRESSION; @@ -62,6 +63,9 @@ public class EnvelopeJarTask extends AbstractArchiveTask { private final Properties javaAgents = new Properties(); + @Getter(onMethod_ = {@Input}) + private final Map systemProperties = new TreeMap<>(); + @Input public Set> getJavaAgents() { return Collections.unmodifiableSet(javaAgents.entrySet()); @@ -71,6 +75,10 @@ public class EnvelopeJarTask extends AbstractArchiveTask { javaAgents.put(className, args); } + public void systemProperty(String key, String value) { + systemProperties.put(key, value); + } + public void includeLibraries(Object... files) { into(Constants.LIBRARIES_FOLDER, (copySpec) -> copySpec.from(files)); } @@ -86,7 +94,6 @@ public class EnvelopeJarTask extends AbstractArchiveTask { getArchiveExtension().convention("jar"); getArchiveVersion().convention(getProject().getVersion().toString()); getArchiveAppendix().convention("envelope"); - exclude("**/module-info.class"); mainClass = objects.property(String.class); mainModule = objects.property(String.class); @@ -257,6 +264,14 @@ public class EnvelopeJarTask extends AbstractArchiveTask { zipEntry.setMethod(ZipEntry.DEFLATED); zipOutputStream.putNextEntry(zipEntry); javaAgents.store(zipOutputStream, null); + zipEntry = zipEntryFactory.createZipEntry(Constants.SYSTEM_PROPERTIES_FILE); + zipEntry.setMethod(ZipEntry.DEFLATED); + zipOutputStream.putNextEntry(zipEntry); + Properties props = new Properties(); + for(Map.Entry entry : systemProperties.entrySet()) { + props.setProperty(entry.getKey(), entry.getValue()); + } + props.store(zipOutputStream, null); while (true) { zipEntry = zipInputStream.getNextEntry(); diff --git a/src/main/java/net/woggioni/gradle/envelope/EnvelopePlugin.java b/src/main/java/net/woggioni/gradle/envelope/EnvelopePlugin.java index 6cd8645..c30d4b8 100644 --- a/src/main/java/net/woggioni/gradle/envelope/EnvelopePlugin.java +++ b/src/main/java/net/woggioni/gradle/envelope/EnvelopePlugin.java @@ -7,7 +7,11 @@ import org.gradle.api.plugins.BasePlugin; import org.gradle.api.plugins.BasePluginExtension; import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.provider.Provider; +import org.gradle.api.tasks.JavaExec; import org.gradle.api.tasks.bundling.Jar; +import org.gradle.process.CommandLineArgumentProvider; + +import java.util.Arrays; public class EnvelopePlugin implements Plugin { @Override @@ -22,5 +26,11 @@ public class EnvelopePlugin implements Plugin { project.getTasks().named(BasePlugin.ASSEMBLE_TASK_NAME, DefaultTask.class, assembleTask -> { assembleTask.dependsOn(envelopeJarTaskProvider); }); + Provider envelopeRunTaskProvider = project.getTasks().register("envelopeRun", JavaExec.class, t -> { + t.getInputs().files(envelopeJarTaskProvider); + t.setGroup("envelope"); + t.setDescription("Run the application in the envelope jar"); + t.classpath(envelopeJarTaskProvider); + }); } }