added system properties support

This commit is contained in:
2022-03-16 23:05:23 +08:00
parent f25606a11a
commit bedff34ecf
6 changed files with 69 additions and 24 deletions

View File

@@ -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";

View File

@@ -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
version.junitPlatform=1.7.0

View File

@@ -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<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();
String currentJarPath = currentJar.getPath();
URL manifestResource = null;

View File

@@ -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/'
}
}

View File

@@ -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<String, String> systemProperties = new TreeMap<>();
@Input
public Set<Map.Entry<Object, Object>> 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<String, String> entry : systemProperties.entrySet()) {
props.setProperty(entry.getKey(), entry.getValue());
}
props.store(zipOutputStream, null);
while (true) {
zipEntry = zipInputStream.getNextEntry();

View File

@@ -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<Project> {
@Override
@@ -22,5 +26,11 @@ public class EnvelopePlugin implements Plugin<Project> {
project.getTasks().named(BasePlugin.ASSEMBLE_TASK_NAME, DefaultTask.class, assembleTask -> {
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);
});
}
}