added system properties support
This commit is contained in:
@@ -13,6 +13,7 @@ public class Constants {
|
|||||||
public static final String DEFAULT_LAUNCHER = "net.woggioni.envelope.Launcher";
|
public static final String DEFAULT_LAUNCHER = "net.woggioni.envelope.Launcher";
|
||||||
public static final String AGENT_LAUNCHER = "net.woggioni.envelope.JavaAgentLauncher";
|
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 JAVA_AGENTS_FILE = METADATA_FOLDER + "/javaAgents.properties";
|
||||||
|
public static final String SYSTEM_PROPERTIES_FILE = METADATA_FOLDER + "/system.properties";
|
||||||
|
|
||||||
public static class ManifestAttributes {
|
public static class ManifestAttributes {
|
||||||
public static final String MAIN_MODULE = "Executable-Jar-Main-Module";
|
public static final String MAIN_MODULE = "Executable-Jar-Main-Module";
|
||||||
|
@@ -1,9 +1,9 @@
|
|||||||
woggioniMavenRepositoryUrl=https://woggioni.net/mvn/
|
woggioniMavenRepositoryUrl=https://woggioni.net/mvn/
|
||||||
publishMavenRepositoryUrl=https://mvn.woggioni.net/
|
publishMavenRepositoryUrl=https://mvn.woggioni.net/
|
||||||
|
|
||||||
version.envelope=0.1
|
version.envelope=1.0-SNAPSHOT
|
||||||
version.gradle=7.4
|
version.gradle=7.4
|
||||||
version.lombok=1.18.22
|
version.lombok=1.18.22
|
||||||
version.xclassloader=1.0
|
version.xclassloader=1.0-SNAPSHOT
|
||||||
version.junitJupiter=5.7.2
|
version.junitJupiter=5.7.2
|
||||||
version.junitPlatform=1.7.0
|
version.junitPlatform=1.7.0
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
package net.woggioni.envelope;
|
package net.woggioni.envelope;
|
||||||
|
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
import lombok.extern.java.Log;
|
|
||||||
|
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
@@ -16,7 +15,9 @@ import java.util.ArrayList;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Enumeration;
|
import java.util.Enumeration;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.Properties;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.jar.Attributes;
|
import java.util.jar.Attributes;
|
||||||
import java.util.jar.JarFile;
|
import java.util.jar.JarFile;
|
||||||
@@ -26,7 +27,6 @@ import java.util.stream.Stream;
|
|||||||
import java.util.stream.StreamSupport;
|
import java.util.stream.StreamSupport;
|
||||||
|
|
||||||
|
|
||||||
@Log
|
|
||||||
public class Launcher {
|
public class Launcher {
|
||||||
|
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
@@ -41,6 +41,19 @@ public class Launcher {
|
|||||||
|
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
|
Enumeration<URL> 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<Object, Object> 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();
|
URI currentJar = findCurrentJar();
|
||||||
String currentJarPath = currentJar.getPath();
|
String currentJarPath = currentJar.getPath();
|
||||||
URL manifestResource = null;
|
URL manifestResource = null;
|
||||||
|
@@ -1,6 +1,12 @@
|
|||||||
pluginManagement {
|
pluginManagement {
|
||||||
repositories {
|
repositories {
|
||||||
maven {
|
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/'
|
url = 'https://woggioni.net/mvn/'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,23 +1,5 @@
|
|||||||
package net.woggioni.gradle.envelope;
|
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.Getter;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
@@ -38,6 +20,25 @@ import org.gradle.api.tasks.WorkResult;
|
|||||||
import org.gradle.api.tasks.bundling.AbstractArchiveTask;
|
import org.gradle.api.tasks.bundling.AbstractArchiveTask;
|
||||||
import org.gradle.util.GradleVersion;
|
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.BEST_COMPRESSION;
|
||||||
import static java.util.zip.Deflater.NO_COMPRESSION;
|
import static java.util.zip.Deflater.NO_COMPRESSION;
|
||||||
@@ -62,6 +63,9 @@ public class EnvelopeJarTask extends AbstractArchiveTask {
|
|||||||
|
|
||||||
private final Properties javaAgents = new Properties();
|
private final Properties javaAgents = new Properties();
|
||||||
|
|
||||||
|
@Getter(onMethod_ = {@Input})
|
||||||
|
private final Map<String, String> systemProperties = new TreeMap<>();
|
||||||
|
|
||||||
@Input
|
@Input
|
||||||
public Set<Map.Entry<Object, Object>> getJavaAgents() {
|
public Set<Map.Entry<Object, Object>> getJavaAgents() {
|
||||||
return Collections.unmodifiableSet(javaAgents.entrySet());
|
return Collections.unmodifiableSet(javaAgents.entrySet());
|
||||||
@@ -71,6 +75,10 @@ public class EnvelopeJarTask extends AbstractArchiveTask {
|
|||||||
javaAgents.put(className, args);
|
javaAgents.put(className, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void systemProperty(String key, String value) {
|
||||||
|
systemProperties.put(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
public void includeLibraries(Object... files) {
|
public void includeLibraries(Object... files) {
|
||||||
into(Constants.LIBRARIES_FOLDER, (copySpec) -> copySpec.from(files));
|
into(Constants.LIBRARIES_FOLDER, (copySpec) -> copySpec.from(files));
|
||||||
}
|
}
|
||||||
@@ -86,7 +94,6 @@ public class EnvelopeJarTask extends AbstractArchiveTask {
|
|||||||
getArchiveExtension().convention("jar");
|
getArchiveExtension().convention("jar");
|
||||||
getArchiveVersion().convention(getProject().getVersion().toString());
|
getArchiveVersion().convention(getProject().getVersion().toString());
|
||||||
getArchiveAppendix().convention("envelope");
|
getArchiveAppendix().convention("envelope");
|
||||||
exclude("**/module-info.class");
|
|
||||||
|
|
||||||
mainClass = objects.property(String.class);
|
mainClass = objects.property(String.class);
|
||||||
mainModule = objects.property(String.class);
|
mainModule = objects.property(String.class);
|
||||||
@@ -257,6 +264,14 @@ public class EnvelopeJarTask extends AbstractArchiveTask {
|
|||||||
zipEntry.setMethod(ZipEntry.DEFLATED);
|
zipEntry.setMethod(ZipEntry.DEFLATED);
|
||||||
zipOutputStream.putNextEntry(zipEntry);
|
zipOutputStream.putNextEntry(zipEntry);
|
||||||
javaAgents.store(zipOutputStream, null);
|
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<String, String> entry : systemProperties.entrySet()) {
|
||||||
|
props.setProperty(entry.getKey(), entry.getValue());
|
||||||
|
}
|
||||||
|
props.store(zipOutputStream, null);
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
zipEntry = zipInputStream.getNextEntry();
|
zipEntry = zipInputStream.getNextEntry();
|
||||||
|
@@ -7,7 +7,11 @@ import org.gradle.api.plugins.BasePlugin;
|
|||||||
import org.gradle.api.plugins.BasePluginExtension;
|
import org.gradle.api.plugins.BasePluginExtension;
|
||||||
import org.gradle.api.plugins.JavaPlugin;
|
import org.gradle.api.plugins.JavaPlugin;
|
||||||
import org.gradle.api.provider.Provider;
|
import org.gradle.api.provider.Provider;
|
||||||
|
import org.gradle.api.tasks.JavaExec;
|
||||||
import org.gradle.api.tasks.bundling.Jar;
|
import org.gradle.api.tasks.bundling.Jar;
|
||||||
|
import org.gradle.process.CommandLineArgumentProvider;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
public class EnvelopePlugin implements Plugin<Project> {
|
public class EnvelopePlugin implements Plugin<Project> {
|
||||||
@Override
|
@Override
|
||||||
@@ -22,5 +26,11 @@ public class EnvelopePlugin implements Plugin<Project> {
|
|||||||
project.getTasks().named(BasePlugin.ASSEMBLE_TASK_NAME, DefaultTask.class, assembleTask -> {
|
project.getTasks().named(BasePlugin.ASSEMBLE_TASK_NAME, DefaultTask.class, assembleTask -> {
|
||||||
assembleTask.dependsOn(envelopeJarTaskProvider);
|
assembleTask.dependsOn(envelopeJarTaskProvider);
|
||||||
});
|
});
|
||||||
|
Provider<JavaExec> 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);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user