From 369571b3426a026de49803efc7ec6764050e65b9 Mon Sep 17 00:00:00 2001 From: Alexander Kerner Date: Tue, 19 Jul 2022 20:15:22 +0200 Subject: [PATCH 01/74] Add some debug --- .../fvarrui/javapackager/packagers/MacPackager.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java b/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java index 78612e4f..d1729d33 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java @@ -139,9 +139,13 @@ public File doCreateApp() throws Exception { Logger.info("Info.plist file created in " + infoPlistFile.getAbsolutePath()); // copy provisionprofile - if(macConfig.getProvisionProfile() != null) { + if (macConfig.getProvisionProfile() != null) { // file name must be 'embedded.provisionprofile' - FileUtils.copyFileToFile(macConfig.getProvisionProfile(), new File(contentsFolder, "embedded.provisionprofile")); + File provisionProfile = new File(contentsFolder, "embedded.provisionprofile"); + FileUtils.copyFileToFile(macConfig.getProvisionProfile(), provisionProfile); + Logger.info("Provision profile file created from " + "\n" + + macConfig.getProvisionProfile() + " to \n" + + provisionProfile.getAbsolutePath()); } // codesigns app folder From 493e840db7ee21f25dd8adf368f2a6d612803764 Mon Sep 17 00:00:00 2001 From: Alexander Kerner Date: Fri, 22 Jul 2022 13:49:08 +0200 Subject: [PATCH 02/74] Upgrade some deps Upgrade some deps to address vulnerabilities. --- build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index af811bca..37e64916 100644 --- a/build.gradle +++ b/build.gradle @@ -46,17 +46,17 @@ dependencies { implementation 'org.apache.maven:maven-plugin-api:3.6.0' implementation 'org.codehaus.plexus:plexus-utils:3.1.1' implementation 'org.twdata.maven:mojo-executor:2.3.0' - implementation 'commons-io:commons-io:2.6' + implementation 'commons-io:commons-io:2.7' implementation 'org.apache.commons:commons-lang3:3.9' implementation 'org.apache.commons:commons-collections4:4.1' implementation 'org.apache.commons:commons-compress:1.21' - implementation 'org.apache.velocity:velocity-engine-core:2.0' + implementation 'org.apache.velocity:velocity-engine-core:2.3' implementation 'org.vafer:jdeb:1.9' implementation 'net.jsign:jsign-core:3.1' implementation 'org.redline-rpm:redline:1.2.10' implementation 'io.github.fvarrui:launch4j:2.5.2' - testImplementation 'junit:junit:4.12' + testImplementation 'junit:junit:4.13.1' compileOnly 'org.apache.maven.plugin-tools:maven-plugin-annotations:3.6.0' From 2e6f934c20a59a06d089ad69b7545e87da650c83 Mon Sep 17 00:00:00 2001 From: Alexander Kerner Date: Fri, 22 Jul 2022 23:25:32 +0200 Subject: [PATCH 03/74] Add custom launcher file property --- .../io/github/fvarrui/javapackager/model/MacConfig.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/io/github/fvarrui/javapackager/model/MacConfig.java b/src/main/java/io/github/fvarrui/javapackager/model/MacConfig.java index 6d961be6..027d979c 100644 --- a/src/main/java/io/github/fvarrui/javapackager/model/MacConfig.java +++ b/src/main/java/io/github/fvarrui/javapackager/model/MacConfig.java @@ -34,6 +34,7 @@ public class MacConfig implements Serializable { private String developerId = "-"; private File entitlements; private File provisionProfile; + private File customLauncher; private boolean codesignApp = true; private InfoPlist infoPlist = new InfoPlist(); private boolean hardenedCodesign = true; @@ -191,6 +192,14 @@ public void setDeveloperId(String developerId) { this.developerId = developerId; } + public File getCustomLauncher() { + return customLauncher; + } + + public void setCustomLauncher(File customLauncher) { + this.customLauncher = customLauncher; + } + public File getProvisionProfile() { return provisionProfile; } From e9064a2ffc76a97535ada2a1d1fd5f9e487cad89 Mon Sep 17 00:00:00 2001 From: Alexander Kerner Date: Fri, 22 Jul 2022 23:45:00 +0200 Subject: [PATCH 04/74] Optimize shell --- src/main/resources/mac/startup.vtl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/mac/startup.vtl b/src/main/resources/mac/startup.vtl index 9e488a04..bf236910 100644 --- a/src/main/resources/mac/startup.vtl +++ b/src/main/resources/mac/startup.vtl @@ -1,4 +1,4 @@ #!/bin/bash # Mac OS X startup script generated by JavaPackager plugin -SCRIPTPATH=`cd "$(dirname "$0")" ; pwd` +SCRIPTPATH=$(cd "$(dirname "$0")" || return 1; pwd) osascript -e "do shell script quoted form of \"$SCRIPTPATH\" & \"/universalJavaApplicationStub $@\" with administrator privileges" & \ No newline at end of file From 2cb21b987f612cf09c95ce4054f88a1073af4cb8 Mon Sep 17 00:00:00 2001 From: Alexander Kerner Date: Sat, 23 Jul 2022 19:51:15 +0200 Subject: [PATCH 05/74] Always build sources --- build.gradle | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/build.gradle b/build.gradle index af811bca..76419f72 100644 --- a/build.gradle +++ b/build.gradle @@ -86,6 +86,11 @@ publishing { } } +java { + withSourcesJar() + // and/or analogously use “withJavadocJar()” to get a “javadocJar” task +} + install.repositories.mavenInstaller.pom.with { groupId = project.group artifactId = project.name From 79219c97d3430c633b208d050e4438a15782649f Mon Sep 17 00:00:00 2001 From: Alexander Kerner Date: Sat, 23 Jul 2022 20:04:03 +0200 Subject: [PATCH 06/74] Support custom app launcher --- .../javapackager/packagers/MacPackager.java | 42 ++++++++++--------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java b/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java index d1729d33..2cc8d373 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java @@ -93,33 +93,37 @@ public File doCreateApp() throws Exception { if (this.administratorRequired) { + // We need a helper script ("startup") in this case, + // which invokes the launcher script/ executable with administrator rights. + // TODO: admin script depends on launcher file name 'universalJavaApplicationStub' + // sets startup file this.executable = new File(macOSFolder, "startup"); // creates startup file to boot java app VelocityUtils.render("mac/startup.vtl", executable, this); - executable.setExecutable(true, false); - Logger.info("Startup script file created in " + executable.getAbsolutePath()); - } else { - // sets startup file - this.executable = new File(macOSFolder, "universalJavaApplicationStub"); - Logger.info("Using " + executable.getAbsolutePath() + " as startup script"); - - } - - // copies universalJavaApplicationStub startup file to boot java app - File appStubFile = new File(macOSFolder, "universalJavaApplicationStub"); - String universalJavaApplicationStubResource = null; - switch (macConfig.getMacStartup()) { - case UNIVERSAL: universalJavaApplicationStubResource = "universalJavaApplicationStub"; break; - case X86_64: universalJavaApplicationStubResource = "universalJavaApplicationStub.x86_64"; break; - case ARM64: universalJavaApplicationStubResource = "universalJavaApplicationStub.arm64"; break; - case SCRIPT: universalJavaApplicationStubResource = "universalJavaApplicationStub.sh"; break; + File launcher = macConfig.getCustomLauncher(); + if(launcher != null && launcher.canRead() && launcher.isFile()){ + FileUtils.copyFileToFolder(launcher, macOSFolder); + this.executable = new File(macOSFolder, launcher.getName()); + } else { + // sets startup file + File appStubFile = new File(macOSFolder, "universalJavaApplicationStub"); + String universalJavaApplicationStubResource = null; + switch (macConfig.getMacStartup()) { + case UNIVERSAL: universalJavaApplicationStubResource = "universalJavaApplicationStub"; break; + case X86_64: universalJavaApplicationStubResource = "universalJavaApplicationStub.x86_64"; break; + case ARM64: universalJavaApplicationStubResource = "universalJavaApplicationStub.arm64"; break; + case SCRIPT: universalJavaApplicationStubResource = "universalJavaApplicationStub.sh"; break; + } + FileUtils.copyResourceToFile("/mac/" + universalJavaApplicationStubResource, appStubFile); + this.executable = appStubFile; + } } - FileUtils.copyResourceToFile("/mac/" + universalJavaApplicationStubResource, appStubFile); - appStubFile.setExecutable(true, false); + executable.setExecutable(true, false); + Logger.info("Startup script file created in " + executable.getAbsolutePath()); // process classpath classpath = (this.macConfig.isRelocateJar() ? "Java/" : "") + this.jarFile.getName() + (classpath != null ? ":" + classpath : ""); From d99d08eac80227ebc375e9c945ab114e460c74b9 Mon Sep 17 00:00:00 2001 From: Alexander Kerner Date: Tue, 26 Jul 2022 13:53:01 +0200 Subject: [PATCH 07/74] Extract code into methods Extract code into methods as a preparation for further refactorings. --- .../javapackager/packagers/MacPackager.java | 71 +++++++++++++------ 1 file changed, 48 insertions(+), 23 deletions(-) diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java b/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java index 2cc8d373..26121705 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java @@ -91,6 +91,20 @@ public File doCreateApp() throws Exception { // copies jarfile to Java folder FileUtils.copyFileToFolder(jarFile, javaFolder); + processStartupScript(); + + processClasspath(); + + processInfoPlistFile(); + + processProvisionProfileFile(); + + codesign(); + + return appFile; + } + + private void processStartupScript() throws Exception { if (this.administratorRequired) { // We need a helper script ("startup") in this case, @@ -109,23 +123,15 @@ public File doCreateApp() throws Exception { FileUtils.copyFileToFolder(launcher, macOSFolder); this.executable = new File(macOSFolder, launcher.getName()); } else { - // sets startup file - File appStubFile = new File(macOSFolder, "universalJavaApplicationStub"); - String universalJavaApplicationStubResource = null; - switch (macConfig.getMacStartup()) { - case UNIVERSAL: universalJavaApplicationStubResource = "universalJavaApplicationStub"; break; - case X86_64: universalJavaApplicationStubResource = "universalJavaApplicationStub.x86_64"; break; - case ARM64: universalJavaApplicationStubResource = "universalJavaApplicationStub.arm64"; break; - case SCRIPT: universalJavaApplicationStubResource = "universalJavaApplicationStub.sh"; break; - } - FileUtils.copyResourceToFile("/mac/" + universalJavaApplicationStubResource, appStubFile); - this.executable = appStubFile; + this.executable = preparePrecompiledStartupStub(); } } executable.setExecutable(true, false); Logger.info("Startup script file created in " + executable.getAbsolutePath()); + } - // process classpath + private void processClasspath() { + // TODO: Why are we doing this here? I do not see any usage of 'classpath' or 'classpaths' here. classpath = (this.macConfig.isRelocateJar() ? "Java/" : "") + this.jarFile.getName() + (classpath != null ? ":" + classpath : ""); classpaths = Arrays.asList(classpath.split("[:;]")); if (!isUseResourcesAsWorkingDir()) { @@ -135,14 +141,30 @@ public File doCreateApp() throws Exception { .collect(Collectors.toList()); } classpath = StringUtils.join(classpaths, ":"); + } - // creates and write the Info.plist file + /** + * Creates and writes the Info.plist file + * @throws Exception if anything goes wrong + */ + private void processInfoPlistFile() throws Exception { File infoPlistFile = new File(contentsFolder, "Info.plist"); VelocityUtils.render("mac/Info.plist.vtl", infoPlistFile, this); XMLUtils.prettify(infoPlistFile); Logger.info("Info.plist file created in " + infoPlistFile.getAbsolutePath()); + } - // copy provisionprofile + private void codesign() throws Exception { + if (!Platform.mac.isCurrentPlatform()) { + Logger.warn("Generated app could not be signed due to current platform is " + Platform.getCurrentPlatform()); + } else if (!getMacConfig().isCodesignApp()) { + Logger.warn("App codesigning disabled"); + } else { + codesign(this.macConfig.getDeveloperId(), this.macConfig.getEntitlements(), this.appFile); + } + } + + private void processProvisionProfileFile() throws Exception { if (macConfig.getProvisionProfile() != null) { // file name must be 'embedded.provisionprofile' File provisionProfile = new File(contentsFolder, "embedded.provisionprofile"); @@ -151,17 +173,20 @@ public File doCreateApp() throws Exception { macConfig.getProvisionProfile() + " to \n" + provisionProfile.getAbsolutePath()); } + } - // codesigns app folder - if (!Platform.mac.isCurrentPlatform()) { - Logger.warn("Generated app could not be signed due to current platform is " + Platform.getCurrentPlatform()); - } else if (!getMacConfig().isCodesignApp()) { - Logger.warn("App codesigning disabled"); - } else { - codesign(this.macConfig.getDeveloperId(), this.macConfig.getEntitlements(), this.appFile); + private File preparePrecompiledStartupStub() throws Exception { + // sets startup file + File appStubFile = new File(macOSFolder, "universalJavaApplicationStub"); + String universalJavaApplicationStubResource = null; + switch (macConfig.getMacStartup()) { + case UNIVERSAL: universalJavaApplicationStubResource = "universalJavaApplicationStub"; break; + case X86_64: universalJavaApplicationStubResource = "universalJavaApplicationStub.x86_64"; break; + case ARM64: universalJavaApplicationStubResource = "universalJavaApplicationStub.arm64"; break; + case SCRIPT: universalJavaApplicationStubResource = "universalJavaApplicationStub.sh"; break; } - - return appFile; + FileUtils.copyResourceToFile("/mac/" + universalJavaApplicationStubResource, appStubFile); + return appStubFile; } private void codesign(String developerId, File entitlements, File appFile) throws Exception { From 82ce97a73e71e6f03f47cb1852c742be8a1c7d15 Mon Sep 17 00:00:00 2001 From: Alexander Kerner Date: Tue, 26 Jul 2022 18:15:13 +0200 Subject: [PATCH 08/74] Add support for custom Info.plist --- .../github/fvarrui/javapackager/model/MacConfig.java | 9 +++++++++ .../fvarrui/javapackager/packagers/MacPackager.java | 12 ++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/github/fvarrui/javapackager/model/MacConfig.java b/src/main/java/io/github/fvarrui/javapackager/model/MacConfig.java index 027d979c..96e4010a 100644 --- a/src/main/java/io/github/fvarrui/javapackager/model/MacConfig.java +++ b/src/main/java/io/github/fvarrui/javapackager/model/MacConfig.java @@ -35,6 +35,7 @@ public class MacConfig implements Serializable { private File entitlements; private File provisionProfile; private File customLauncher; + private File customInfoPlist; private boolean codesignApp = true; private InfoPlist infoPlist = new InfoPlist(); private boolean hardenedCodesign = true; @@ -200,6 +201,14 @@ public void setCustomLauncher(File customLauncher) { this.customLauncher = customLauncher; } + public File getCustomInfoPlist() { + return customInfoPlist; + } + + public void setCustomInfoPlist(File customInfoPlist) { + this.customInfoPlist = customInfoPlist; + } + public File getProvisionProfile() { return provisionProfile; } diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java b/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java index 26121705..243d7710 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java @@ -144,13 +144,17 @@ private void processClasspath() { } /** - * Creates and writes the Info.plist file + * Creates and writes the Info.plist file if no custom file is specified. * @throws Exception if anything goes wrong */ private void processInfoPlistFile() throws Exception { File infoPlistFile = new File(contentsFolder, "Info.plist"); - VelocityUtils.render("mac/Info.plist.vtl", infoPlistFile, this); - XMLUtils.prettify(infoPlistFile); + if(macConfig.getCustomInfoPlist() != null && macConfig.getCustomInfoPlist().isFile() && macConfig.getCustomInfoPlist().canRead()){ + FileUtils.copyFileToFile(macConfig.getCustomInfoPlist(), infoPlistFile); + } else { + VelocityUtils.render("mac/Info.plist.vtl", infoPlistFile, this); + XMLUtils.prettify(infoPlistFile); + } Logger.info("Info.plist file created in " + infoPlistFile.getAbsolutePath()); } @@ -165,7 +169,7 @@ private void codesign() throws Exception { } private void processProvisionProfileFile() throws Exception { - if (macConfig.getProvisionProfile() != null) { + if (macConfig.getProvisionProfile() != null && macConfig.getProvisionProfile().isFile() && macConfig.getProvisionProfile().canRead()) { // file name must be 'embedded.provisionprofile' File provisionProfile = new File(contentsFolder, "embedded.provisionprofile"); FileUtils.copyFileToFile(macConfig.getProvisionProfile(), provisionProfile); From fdca8ec33093bade7b28bb471bdf7ba1059b24ec Mon Sep 17 00:00:00 2001 From: fvarrui <4354486+fvarrui@users.noreply.github.com> Date: Thu, 28 Jul 2022 18:45:27 +0100 Subject: [PATCH 09/74] U if macos startup is a script then 'unixStyleNewLinux=true', replacing '\r\n' with '\n' --- .../github/fvarrui/javapackager/packagers/MacPackager.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java b/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java index 243d7710..e7da3a5d 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java @@ -9,6 +9,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.SystemUtils; +import io.github.fvarrui.javapackager.model.MacStartup; import io.github.fvarrui.javapackager.model.Platform; import io.github.fvarrui.javapackager.utils.CommandUtils; import io.github.fvarrui.javapackager.utils.FileUtils; @@ -105,6 +106,7 @@ public File doCreateApp() throws Exception { } private void processStartupScript() throws Exception { + if (this.administratorRequired) { // We need a helper script ("startup") in this case, @@ -116,6 +118,7 @@ private void processStartupScript() throws Exception { // creates startup file to boot java app VelocityUtils.render("mac/startup.vtl", executable, this); + } else { File launcher = macConfig.getCustomLauncher(); @@ -126,6 +129,7 @@ private void processStartupScript() throws Exception { this.executable = preparePrecompiledStartupStub(); } } + executable.setExecutable(true, false); Logger.info("Startup script file created in " + executable.getAbsolutePath()); } @@ -189,7 +193,8 @@ private File preparePrecompiledStartupStub() throws Exception { case ARM64: universalJavaApplicationStubResource = "universalJavaApplicationStub.arm64"; break; case SCRIPT: universalJavaApplicationStubResource = "universalJavaApplicationStub.sh"; break; } - FileUtils.copyResourceToFile("/mac/" + universalJavaApplicationStubResource, appStubFile); + // unixStyleNewLinux=true if startup is a script (this will replace '\r\n' with '\n') + FileUtils.copyResourceToFile("/mac/" + universalJavaApplicationStubResource, appStubFile, macConfig.getMacStartup() == MacStartup.SCRIPT); return appStubFile; } From d3623ee5eb1a22f5e8eaf81ba372fe4c77b7ad01 Mon Sep 17 00:00:00 2001 From: fvarrui <4354486+fvarrui@users.noreply.github.com> Date: Thu, 28 Jul 2022 18:46:25 +0100 Subject: [PATCH 10/74] U v1.6.7 to v.1.7.0-SNAPSHOT --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 3d5d1505..e5657191 100644 --- a/build.gradle +++ b/build.gradle @@ -70,7 +70,7 @@ dependencies { } group = 'io.github.fvarrui' -version = '1.6.7' +version = '1.7.0-SNAPSHOT' description = 'Hybrid Maven/Gradle plugin to package Java applications as native Windows, Mac OS X or GNU/Linux executables and create installers for them' sourceCompatibility = JavaVersion.VERSION_1_8 @@ -88,7 +88,7 @@ publishing { java { withSourcesJar() - // and/or analogously use “withJavadocJar()” to get a “javadocJar” task + // and/or analogously use “withJavadocJar()â€� to get a “javadocJarâ€� task } install.repositories.mavenInstaller.pom.with { From 50e56362865bfbb6429bbb593258bd3d0c3d7c66 Mon Sep 17 00:00:00 2001 From: fvarrui <4354486+fvarrui@users.noreply.github.com> Date: Thu, 28 Jul 2022 18:47:24 +0100 Subject: [PATCH 11/74] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6f8e9e0b..d6c11227 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Add the following `plugin` tag to your `pom.xml`: io.github.fvarrui javapackager - 1.6.7 + 1.7.0-SNAPSHOT package @@ -78,7 +78,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'io.github.fvarrui:javapackager:1.6.7' + classpath 'io.github.fvarrui:javapackager:1.7.0-SNAPSHOT' } } From 77ab94b21a682b761af6c2012f1fa96690224c65 Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Mon, 1 Aug 2022 17:36:54 +0200 Subject: [PATCH 12/74] unified gradle and maven configs so that only one file needs to be changed when modifying or adding new stuff; iconFile was not present in gradle PackageTask before, added that; renamed appName to name (gradle); renamed appDescription to description (gradle); --- .../gradle/GradlePackagerSettings.java | 98 +++ .../javapackager/gradle/PackageTask.java | 585 +----------------- .../packagers/PackagerSettings.java | 90 ++- .../javapackager/utils/DownloadUtils.java | 5 + 4 files changed, 195 insertions(+), 583 deletions(-) create mode 100644 src/main/java/io/github/fvarrui/javapackager/gradle/GradlePackagerSettings.java create mode 100644 src/main/java/io/github/fvarrui/javapackager/utils/DownloadUtils.java diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/GradlePackagerSettings.java b/src/main/java/io/github/fvarrui/javapackager/gradle/GradlePackagerSettings.java new file mode 100644 index 00000000..64b22df1 --- /dev/null +++ b/src/main/java/io/github/fvarrui/javapackager/gradle/GradlePackagerSettings.java @@ -0,0 +1,98 @@ +package io.github.fvarrui.javapackager.gradle; + +import groovy.lang.Closure; +import io.github.fvarrui.javapackager.model.MacConfig; +import io.github.fvarrui.javapackager.model.Manifest; +import io.github.fvarrui.javapackager.model.Scripts; +import io.github.fvarrui.javapackager.model.WindowsConfig; +import io.github.fvarrui.javapackager.packagers.Context; +import io.github.fvarrui.javapackager.packagers.Packager; +import io.github.fvarrui.javapackager.packagers.PackagerFactory; +import io.github.fvarrui.javapackager.packagers.PackagerSettings; + +import static io.github.fvarrui.javapackager.utils.ObjectUtils.defaultIfBlank; +import static io.github.fvarrui.javapackager.utils.ObjectUtils.defaultIfNull; + +public class GradlePackagerSettings extends PackagerSettings { + PackageTask packageTask; + + public GradlePackagerSettings(PackageTask packageTask) { + this.packageTask = packageTask; + } + + public MacConfig macConfig(Closure closure) { + macConfig = new MacConfig(); + packageTask.getProject().configure(macConfig, closure); + return macConfig; + } + + public WindowsConfig winConfig(Closure closure) { + winConfig = new WindowsConfig(); + packageTask.getProject().configure(winConfig, closure); + return winConfig; + } + + public Manifest manifest(Closure closure) { + manifest = new Manifest(); + packageTask.getProject().configure(manifest, closure); + return manifest; + } + + public Scripts scripts(Closure closure) { + scripts = new Scripts(); + packageTask.getProject().configure(scripts, closure); + return scripts; + } + + @SuppressWarnings("unchecked") + public Packager createPackager() throws Exception { + + PackagePluginExtension extension = packageTask.getProject().getExtensions().findByType(PackagePluginExtension.class); + + return + (Packager) PackagerFactory + .createPackager(defaultIfNull(platform, extension.getPlatform())) + .additionalModules(defaultIfNull(additionalModules, extension.getAdditionalModules())) + .additionalModulePaths(defaultIfNull(additionalModulePaths, extension.getAdditionalModulePaths())) + .additionalResources(defaultIfNull(additionalResources, extension.getAdditionalResources())) + .administratorRequired(defaultIfNull(administratorRequired, extension.getAdministratorRequired())) + .assetsDir(defaultIfNull(assetsDir, extension.getAssetsDir())) + .bundleJre(defaultIfNull(bundleJre, extension.getBundleJre())) + .classpath(defaultIfNull(classpath, extension.getClasspath())) + .copyDependencies(defaultIfNull(copyDependencies, extension.getCopyDependencies())) + .createTarball(defaultIfNull(createTarball, extension.getCreateTarball())) + .createZipball(defaultIfNull(createZipball, extension.getCreateZipball())) + .customizedJre(defaultIfNull(customizedJre, extension.getCustomizedJre())) + .description(defaultIfNull(description, extension.getDescription())) + .displayName(defaultIfNull(displayName, extension.getDisplayName())) + .envPath(defaultIfNull(envPath, extension.getEnvPath())) + .extra(defaultIfNull(extra, extension.getExtra())) + .fileAssociations(defaultIfNull(fileAssociations, extension.getFileAssociations())) + .forceInstaller(defaultIfNull(forceInstaller, extension.isForceInstaller())) + .generateInstaller(defaultIfNull(generateInstaller, extension.getGenerateInstaller())) + .jdkPath(defaultIfNull(jdkPath, extension.getJdkPath())) + .jreDirectoryName(defaultIfBlank(jreDirectoryName, extension.getJreDirectoryName())) + .jreMinVersion(defaultIfBlank(jreMinVersion, extension.getJreMinVersion())) + .jrePath(defaultIfNull(jrePath, extension.getJrePath())) + .licenseFile(defaultIfNull(licenseFile, extension.getLicenseFile())) + .linuxConfig(defaultIfNull(linuxConfig, extension.getLinuxConfig())) + .macConfig(defaultIfNull(macConfig, extension.getMacConfig())) + .mainClass(defaultIfNull(mainClass, extension.getMainClass())) + .manifest(defaultIfNull(manifest, extension.getManifest())) + .modules(defaultIfNull(modules, extension.getModules())) + .name(defaultIfNull(name, extension.getName())) + .organizationEmail(defaultIfNull(organizationEmail, extension.getOrganizationEmail())) + .organizationName(defaultIfNull(organizationName, extension.getOrganizationName())) + .organizationUrl(defaultIfNull(organizationUrl, extension.getOrganizationUrl())) + .outputDirectory(defaultIfNull(outputDirectory, extension.getOutputDirectory())) + .packagingJdk(defaultIfNull(packagingJdk, extension.getPackagingJdk(), Context.getGradleContext().getDefaultToolchain())) + .runnableJar(defaultIfNull(runnableJar, extension.getRunnableJar())) + .scripts(defaultIfNull(scripts, extension.getScripts())) + .useResourcesAsWorkingDir(defaultIfNull(useResourcesAsWorkingDir, extension.isUseResourcesAsWorkingDir())) + .url(defaultIfNull(url, extension.getUrl())) + .version(defaultIfNull(version, extension.getVersion(), packageTask.getProject().getVersion().toString())) + .vmArgs(defaultIfNull(vmArgs, extension.getVmArgs())) + .winConfig(defaultIfNull(winConfig, extension.getWinConfig())) + .iconFile(defaultIfNull(iconFile, extension.getIconFile())); + } +} diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/PackageTask.java b/src/main/java/io/github/fvarrui/javapackager/gradle/PackageTask.java index 1e9d109a..360ada5f 100644 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/PackageTask.java +++ b/src/main/java/io/github/fvarrui/javapackager/gradle/PackageTask.java @@ -7,6 +7,7 @@ import java.util.List; import java.util.Map; +import io.github.fvarrui.javapackager.packagers.PackagerSettings; import org.gradle.api.tasks.Input; import org.gradle.api.tasks.InputDirectory; import org.gradle.api.tasks.InputFile; @@ -29,592 +30,12 @@ * Packaging task fro Gradle */ public class PackageTask extends AbstractPackageTask { - - // =============== - // task parameters - // =============== - - @Input - @Optional - private Platform platform; - - public Platform getPlatform() { - return platform; - } - - public void setPlatform(Platform platform) { - this.platform = platform; - } - - @Input - @Optional - private List additionalModules; - - public List getAdditionalModules() { - return additionalModules; - } - - public void setAdditionalModules(List additionalModules) { - this.additionalModules = additionalModules; - } - - @Input - @Optional - private List additionalResources; - - public List getAdditionalResources() { - return additionalResources; - } - - public void setAdditionalResources(List additionalResources) { - this.additionalResources = additionalResources; - } - - @Input - @Optional - private Boolean administratorRequired; - - public Boolean isAdministratorRequired() { - return administratorRequired; - } - - public void setAdministratorRequired(Boolean administratorRequired) { - this.administratorRequired = administratorRequired; - } - - @InputDirectory - @Optional - private File assetsDir; - - public File getAssetsDir() { - return assetsDir; - } - - public void setAssetsDir(File assetsDir) { - this.assetsDir = assetsDir; - } - - @InputDirectory - @Optional - private File packagingJdk; - - public File getPackagingJdk() { - return packagingJdk; - } - - public void setPackagingJdk(File packagingJdk) { - this.packagingJdk = packagingJdk; - } - - @Input - @Optional - private Boolean bundleJre; - - public Boolean isBundleJre() { - return bundleJre; - } - - public void setBundleJre(Boolean bundleJre) { - this.bundleJre = bundleJre; - } - - @Input - @Optional - private Boolean copyDependencies; - - public Boolean isCopyDependencies() { - return copyDependencies; - } - - public void setCopyDependencies(Boolean copyDependencies) { - this.copyDependencies = copyDependencies; - } + public GradlePackagerSettings settings = new GradlePackagerSettings(this); - @Input - @Optional - private Boolean createTarball; - - public Boolean isCreateTarball() { - return createTarball; - } - - public void setCreateTarball(Boolean createTarball) { - this.createTarball = createTarball; - } - - @Input - @Optional - private Boolean createZipball; - - public Boolean isCreateZipball() { - return createZipball; - } - - public void setCreateZipball(Boolean createZipball) { - this.createZipball = createZipball; - } - - @Input - @Optional - private Boolean customizedJre; - - public Boolean isCustomizedJre() { - return customizedJre; - } - - public void setCustomizedJre(Boolean customizedJre) { - this.customizedJre = customizedJre; - } - - @Input - @Optional - private String appDescription; - - public String getAppDescription() { - return appDescription; - } - - public void setAppDescription(String appDescription) { - this.appDescription = appDescription; - } - - @Input - @Optional - private String displayName; - - public String getDisplayName() { - return displayName; - } - - public void setDisplayName(String displayName) { - this.displayName = displayName; - } - - @Input - @Optional - private String envPath; - - public String getEnvPath() { - return envPath; - } - - public void setEnvPath(String envPath) { - this.envPath = envPath; - } - - @Input - @Optional - private Map extra; - - public Map getExtra() { - return extra; - } - - public void setExtra(Map extra) { - this.extra = extra; - } - - @Input - @Optional - private Boolean generateInstaller; - - public Boolean isGenerateInstaller() { - return generateInstaller; - } - - public void setGenerateInstaller(Boolean generateInstaller) { - this.generateInstaller = generateInstaller; - } - - @Input - @Optional - private Boolean forceInstaller; - - public Boolean isForceInstaller() { - return forceInstaller; - } - - public void setForceInstaller(Boolean forceInstaller) { - this.forceInstaller = forceInstaller; - } - - @InputDirectory - @Optional - private File jdkPath; - - public File getJdkPath() { - return jdkPath; - } - - public void setJdkPath(File jdkPath) { - this.jdkPath = jdkPath; - } - - @Input - @Optional - private String jreDirectoryName; - - public String getJreDirectoryName() { - return jreDirectoryName; - } - - public void setJreDirectoryName(String jreDirectoryName) { - this.jreDirectoryName = jreDirectoryName; - } - - @InputDirectory - @Optional - private File jrePath; - - public File getJrePath() { - return jrePath; - } - - public void setJrePath(File jrePath) { - this.jrePath = jrePath; - } - - @InputFile - @Optional - private File licenseFile; - - public File getLicenseFile() { - return licenseFile; - } - - public void setLicenseFile(File licenseFile) { - this.licenseFile = licenseFile; - } - - @Input - @Optional - private LinuxConfig linuxConfig; - - public LinuxConfig getLinuxConfig() { - return linuxConfig; - } - - public void setLinuxConfig(LinuxConfig linuxConfig) { - this.linuxConfig = linuxConfig; - } - - public LinuxConfig linuxConfig(Closure closure) { - linuxConfig = new LinuxConfig(); - getProject().configure(linuxConfig, closure); - return linuxConfig; - } - - @Input - @Optional - private MacConfig macConfig; - - public MacConfig getMacConfig() { - return macConfig; - } - - public void setMacConfig(MacConfig macConfig) { - this.macConfig = macConfig; - } - - public MacConfig macConfig(Closure closure) { - macConfig = new MacConfig(); - getProject().configure(macConfig, closure); - return macConfig; - } - - @Input - @Optional - private String mainClass; - - public String getMainClass() { - return mainClass; - } - - public void setMainClass(String mainClass) { - this.mainClass = mainClass; - } - - @Input - @Optional - private List modules; - - public List getModules() { - return modules; - } - - public void setModules(List modules) { - this.modules = modules; - } - - @Input - @Optional - private String appName; - - public String getAppName() { - return appName; - } - - public void setAppName(String appName) { - this.appName = appName; - } - - @Input - @Optional - private String organizationEmail; - - public String getOrganizationEmail() { - return organizationEmail; - } - - public void setOrganizationEmail(String organizationEmail) { - this.organizationEmail = organizationEmail; - } - - @Input - @Optional - private String organizationName; - - public String getOrganizationName() { - return organizationName; - } - - public void setOrganizationName(String organizationName) { - this.organizationName = organizationName; - } - - @Input - @Optional - private String organizationUrl; - - public String getOrganizationUrl() { - return organizationUrl; - } - - public void setOrganizationUrl(String organizationUrl) { - this.organizationUrl = organizationUrl; - } - - @InputFile - @Optional - private File runnableJar; - - public File getRunnableJar() { - return runnableJar; - } - - public void setRunnableJar(File runnableJar) { - this.runnableJar = runnableJar; - } - - @Input - @Optional - private Boolean useResourcesAsWorkingDir; - - public Boolean isUseResourcesAsWorkingDir() { - return useResourcesAsWorkingDir; - } - - public void setUseResourcesAsWorkingDir(Boolean useResourcesAsWorkingDir) { - this.useResourcesAsWorkingDir = useResourcesAsWorkingDir; - } - - @Input - @Optional - private String url; - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - @Input - @Optional - private List vmArgs; - - public List getVmArgs() { - return vmArgs; - } - - public void setVmArgs(List vmArgs) { - this.vmArgs = vmArgs; - } - - @Input - @Optional - private WindowsConfig winConfig; - - public WindowsConfig getWinConfig() { - return winConfig; - } - - public WindowsConfig winConfig(Closure closure) { - winConfig = new WindowsConfig(); - getProject().configure(winConfig, closure); - return winConfig; - } - - @Input - @Optional - private String version; - - public String getVersion() { - return version; - } - - public void setVersion(String version) { - this.version = version; - } - - @OutputDirectory - @Optional - private File outputDirectory; - - public File getOutputDirectory() { - return outputDirectory; - } - - public void setOutputDirectory(File outputDirectory) { - this.outputDirectory = outputDirectory; - } - - @Input - @Optional - private String classpath; - - public String getClasspath() { - return classpath; - } - - public void setClasspath(String classpath) { - this.classpath = classpath; - } - - @Input - @Optional - private String jreMinVersion; - - public String getJreMinVersion() { - return jreMinVersion; - } - - public void setJreMinVersion(String jreMinVersion) { - this.jreMinVersion = jreMinVersion; - } - - @Input - @Optional - private Manifest manifest; - - public Manifest getManifest() { - return manifest; - } - - public Manifest manifest(Closure closure) { - manifest = new Manifest(); - getProject().configure(manifest, closure); - return manifest; - } - - @Input - @Optional - private List additionalModulePaths; - - public List getAdditionalModulePaths() { - return additionalModulePaths; - } - - public void setAdditionalModulePaths(List additionalModulePaths) { - this.additionalModulePaths = additionalModulePaths; - } - - @Input - @Optional - private List fileAssociations; - - public List getFileAssociations() { - return fileAssociations; - } - - public void setFileAssociations(List fileAssociations) { - this.fileAssociations = fileAssociations; - } - - @Input - @Optional - private Scripts scripts; - - public Scripts getScripts() { - return scripts; - } - - public void setScripts(Scripts scripts) { - this.scripts = scripts; - } - - public Scripts scripts(Closure closure) { - scripts = new Scripts(); - getProject().configure(scripts, closure); - return scripts; - } - - // =============== - // create packager - // =============== - @SuppressWarnings("unchecked") @Override protected Packager createPackager() throws Exception { - - PackagePluginExtension extension = getProject().getExtensions().findByType(PackagePluginExtension.class); - - return - (Packager) PackagerFactory - .createPackager(defaultIfNull(platform, extension.getPlatform())) - .additionalModules(defaultIfNull(additionalModules, extension.getAdditionalModules())) - .additionalModulePaths(defaultIfNull(additionalModulePaths, extension.getAdditionalModulePaths())) - .additionalResources(defaultIfNull(additionalResources, extension.getAdditionalResources())) - .administratorRequired(defaultIfNull(administratorRequired, extension.getAdministratorRequired())) - .assetsDir(defaultIfNull(assetsDir, extension.getAssetsDir())) - .bundleJre(defaultIfNull(bundleJre, extension.getBundleJre())) - .classpath(defaultIfNull(classpath, extension.getClasspath())) - .copyDependencies(defaultIfNull(copyDependencies, extension.getCopyDependencies())) - .createTarball(defaultIfNull(createTarball, extension.getCreateTarball())) - .createZipball(defaultIfNull(createZipball, extension.getCreateZipball())) - .customizedJre(defaultIfNull(customizedJre, extension.getCustomizedJre())) - .description(defaultIfNull(appDescription, extension.getDescription())) - .displayName(defaultIfNull(displayName, extension.getDisplayName())) - .envPath(defaultIfNull(envPath, extension.getEnvPath())) - .extra(defaultIfNull(extra, extension.getExtra())) - .fileAssociations(defaultIfNull(fileAssociations, extension.getFileAssociations())) - .forceInstaller(defaultIfNull(forceInstaller, extension.isForceInstaller())) - .generateInstaller(defaultIfNull(generateInstaller, extension.getGenerateInstaller())) - .jdkPath(defaultIfNull(jdkPath, extension.getJdkPath())) - .jreDirectoryName(defaultIfBlank(jreDirectoryName, extension.getJreDirectoryName())) - .jreMinVersion(defaultIfBlank(jreMinVersion, extension.getJreMinVersion())) - .jrePath(defaultIfNull(jrePath, extension.getJrePath())) - .licenseFile(defaultIfNull(licenseFile, extension.getLicenseFile())) - .linuxConfig(defaultIfNull(linuxConfig, extension.getLinuxConfig())) - .macConfig(defaultIfNull(macConfig, extension.getMacConfig())) - .mainClass(defaultIfNull(mainClass, extension.getMainClass())) - .manifest(defaultIfNull(manifest, extension.getManifest())) - .modules(defaultIfNull(modules, extension.getModules())) - .name(defaultIfNull(appName, extension.getName())) - .organizationEmail(defaultIfNull(organizationEmail, extension.getOrganizationEmail())) - .organizationName(defaultIfNull(organizationName, extension.getOrganizationName())) - .organizationUrl(defaultIfNull(organizationUrl, extension.getOrganizationUrl())) - .outputDirectory(defaultIfNull(outputDirectory, extension.getOutputDirectory())) - .packagingJdk(defaultIfNull(packagingJdk, extension.getPackagingJdk(), Context.getGradleContext().getDefaultToolchain())) - .runnableJar(defaultIfNull(runnableJar, extension.getRunnableJar())) - .scripts(defaultIfNull(scripts, extension.getScripts())) - .useResourcesAsWorkingDir(defaultIfNull(useResourcesAsWorkingDir, extension.isUseResourcesAsWorkingDir())) - .url(defaultIfNull(url, extension.getUrl())) - .version(defaultIfNull(version, extension.getVersion(), getProject().getVersion().toString())) - .vmArgs(defaultIfNull(vmArgs, extension.getVmArgs())) - .winConfig(defaultIfNull(winConfig, extension.getWinConfig())); - + return settings.createPackager(); } } diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerSettings.java b/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerSettings.java index fd5f8554..0f4df076 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerSettings.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerSettings.java @@ -15,54 +15,142 @@ import io.github.fvarrui.javapackager.model.Platform; import io.github.fvarrui.javapackager.model.Scripts; import io.github.fvarrui.javapackager.model.WindowsConfig; +import org.gradle.api.tasks.*; /** - * Common packagers' settings + * Common packagers' settings, + * supports maven and gradle. */ public class PackagerSettings { + @OutputDirectory + @Optional protected File outputDirectory; + @InputFile + @Optional protected File licenseFile; + @InputFile + @Optional protected File iconFile; + @Input + @Optional protected Boolean generateInstaller; + @Input + @Optional protected boolean forceInstaller; + @Input + @Optional protected String mainClass; + @Input + @Optional protected String name; + @Input + @Optional protected String displayName; + @Input + @Optional protected String version; + @Input + @Optional protected String description; + @Input + @Optional protected String url; + @Input + @Optional protected Boolean administratorRequired; + @Input + @Optional protected String organizationName; + @Input + @Optional protected String organizationUrl; + @Input + @Optional protected String organizationEmail; + @Input + @Optional protected Boolean bundleJre; + @Input + @Optional protected Boolean customizedJre; + @InputDirectory + @Optional protected File jrePath; + @InputDirectory + @Optional protected File jdkPath; + @Input + @Optional protected List additionalResources; + @Input + @Optional protected List modules; + @Input + @Optional protected List additionalModules; + @Input + @Optional protected Platform platform; + @Input + @Optional protected String envPath; + @Input + @Optional protected List vmArgs; + @InputFile + @Optional protected File runnableJar; + @Input + @Optional protected Boolean copyDependencies; + @Input + @Optional protected String jreDirectoryName; + @Input + @Optional protected WindowsConfig winConfig; + @Input + @Optional protected LinuxConfig linuxConfig; + @Input + @Optional protected MacConfig macConfig; + @Input + @Optional protected Boolean createTarball; + @Input + @Optional protected Boolean createZipball; + @Input + @Optional protected Map extra; + @Input + @Optional protected boolean useResourcesAsWorkingDir; + @InputDirectory + @Optional protected File assetsDir; + @Input + @Optional protected String classpath; + @Input + @Optional protected String jreMinVersion; + @Input + @Optional protected Manifest manifest; + @Input + @Optional protected List additionalModulePaths; + @Input + @Optional protected List fileAssociations; + @InputDirectory + @Optional protected File packagingJdk; + @Input + @Optional protected Scripts scripts; /** diff --git a/src/main/java/io/github/fvarrui/javapackager/utils/DownloadUtils.java b/src/main/java/io/github/fvarrui/javapackager/utils/DownloadUtils.java new file mode 100644 index 00000000..d2344e57 --- /dev/null +++ b/src/main/java/io/github/fvarrui/javapackager/utils/DownloadUtils.java @@ -0,0 +1,5 @@ +package io.github.fvarrui.javapackager.utils; + +public class DownloadUtils { + +} From 053c22241b8ac3064fcf39cc5d8c14140beceade Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Mon, 1 Aug 2022 17:45:45 +0200 Subject: [PATCH 13/74] cleanup imports --- .../javapackager/gradle/PackageTask.java | 24 ------------------- 1 file changed, 24 deletions(-) diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/PackageTask.java b/src/main/java/io/github/fvarrui/javapackager/gradle/PackageTask.java index 360ada5f..a6b15423 100644 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/PackageTask.java +++ b/src/main/java/io/github/fvarrui/javapackager/gradle/PackageTask.java @@ -1,30 +1,6 @@ package io.github.fvarrui.javapackager.gradle; -import static io.github.fvarrui.javapackager.utils.ObjectUtils.defaultIfBlank; -import static io.github.fvarrui.javapackager.utils.ObjectUtils.defaultIfNull; - -import java.io.File; -import java.util.List; -import java.util.Map; - -import io.github.fvarrui.javapackager.packagers.PackagerSettings; -import org.gradle.api.tasks.Input; -import org.gradle.api.tasks.InputDirectory; -import org.gradle.api.tasks.InputFile; -import org.gradle.api.tasks.Optional; -import org.gradle.api.tasks.OutputDirectory; - -import groovy.lang.Closure; -import io.github.fvarrui.javapackager.model.FileAssociation; -import io.github.fvarrui.javapackager.model.LinuxConfig; -import io.github.fvarrui.javapackager.model.MacConfig; -import io.github.fvarrui.javapackager.model.Manifest; -import io.github.fvarrui.javapackager.model.Platform; -import io.github.fvarrui.javapackager.model.Scripts; -import io.github.fvarrui.javapackager.model.WindowsConfig; -import io.github.fvarrui.javapackager.packagers.Context; import io.github.fvarrui.javapackager.packagers.Packager; -import io.github.fvarrui.javapackager.packagers.PackagerFactory; /** * Packaging task fro Gradle From bc9e4757d2cb64d53cd54bac8c0d00a531437aff Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Mon, 1 Aug 2022 18:04:40 +0200 Subject: [PATCH 14/74] removed redundant PackagePluginExtension that was replaced with GradlePackagerSettings --- .../gradle/DefaultPackageTask.java | 4 +- .../gradle/GradlePackagerSettings.java | 44 ++++++++-- .../javapackager/gradle/PackagePlugin.java | 2 +- .../gradle/PackagePluginExtension.java | 87 ------------------- .../packagers/PackagerSettings.java | 6 ++ .../javapackager/utils/NativeUtils.java | 9 ++ 6 files changed, 57 insertions(+), 95 deletions(-) delete mode 100644 src/main/java/io/github/fvarrui/javapackager/gradle/PackagePluginExtension.java create mode 100644 src/main/java/io/github/fvarrui/javapackager/utils/NativeUtils.java diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/DefaultPackageTask.java b/src/main/java/io/github/fvarrui/javapackager/gradle/DefaultPackageTask.java index 791a23be..cddb3571 100644 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/DefaultPackageTask.java +++ b/src/main/java/io/github/fvarrui/javapackager/gradle/DefaultPackageTask.java @@ -12,8 +12,8 @@ public class DefaultPackageTask extends AbstractPackageTask { @Override protected Packager createPackager() throws Exception { - - PackagePluginExtension extension = getProject().getExtensions().findByType(PackagePluginExtension.class); + + GradlePackagerSettings extension = getProject().getExtensions().findByType(GradlePackagerSettings.class); return (Packager) PackagerFactory diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/GradlePackagerSettings.java b/src/main/java/io/github/fvarrui/javapackager/gradle/GradlePackagerSettings.java index 64b22df1..9cb8a0a3 100644 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/GradlePackagerSettings.java +++ b/src/main/java/io/github/fvarrui/javapackager/gradle/GradlePackagerSettings.java @@ -1,15 +1,16 @@ package io.github.fvarrui.javapackager.gradle; import groovy.lang.Closure; -import io.github.fvarrui.javapackager.model.MacConfig; -import io.github.fvarrui.javapackager.model.Manifest; -import io.github.fvarrui.javapackager.model.Scripts; -import io.github.fvarrui.javapackager.model.WindowsConfig; +import io.github.fvarrui.javapackager.model.*; import io.github.fvarrui.javapackager.packagers.Context; import io.github.fvarrui.javapackager.packagers.Packager; import io.github.fvarrui.javapackager.packagers.PackagerFactory; import io.github.fvarrui.javapackager.packagers.PackagerSettings; +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; + import static io.github.fvarrui.javapackager.utils.ObjectUtils.defaultIfBlank; import static io.github.fvarrui.javapackager.utils.ObjectUtils.defaultIfNull; @@ -18,6 +19,39 @@ public class GradlePackagerSettings extends PackagerSettings { public GradlePackagerSettings(PackageTask packageTask) { this.packageTask = packageTask; + this.platform = Platform.auto; + this.additionalModules = new ArrayList<>(); + this.additionalModulePaths = new ArrayList<>(); + this.additionalResources = new ArrayList<>(); + this.administratorRequired = false; + this.assetsDir = new File(packageTask.getProject().getProjectDir(), "assets"); + this.bundleJre = true; + this.copyDependencies = true; + this.createTarball = false; + this.createZipball = false; + this.customizedJre = true; + this.description = packageTask.getProject().getDescription(); + this.extra = new HashMap<>(); + this.generateInstaller = true; + this.jreDirectoryName = "jre"; + this.linuxConfig = new LinuxConfig(); + this.macConfig = new MacConfig(); + this.manifest = new Manifest(); + this.modules = new ArrayList<>(); + this.name = packageTask.getProject().getName(); + this.organizationEmail = ""; + this.useResourcesAsWorkingDir = true; + this.vmArgs = new ArrayList<>(); + this.winConfig = new WindowsConfig(); + this.outputDirectory = packageTask.getProject().getBuildDir(); + this.scripts = new Scripts(); + this.forceInstaller = false; + } + + public LinuxConfig linuxConfig(Closure closure) { + linuxConfig = new LinuxConfig(); + packageTask.getProject().configure(linuxConfig, closure); + return linuxConfig; } public MacConfig macConfig(Closure closure) { @@ -47,7 +81,7 @@ public Scripts scripts(Closure closure) { @SuppressWarnings("unchecked") public Packager createPackager() throws Exception { - PackagePluginExtension extension = packageTask.getProject().getExtensions().findByType(PackagePluginExtension.class); + GradlePackagerSettings extension = packageTask.getProject().getExtensions().findByType(GradlePackagerSettings.class); return (Packager) PackagerFactory diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePlugin.java b/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePlugin.java index acc47b3d..001e71a8 100644 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePlugin.java +++ b/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePlugin.java @@ -24,7 +24,7 @@ public void apply(Project project) { project.getPluginManager().apply("java"); project.getPluginManager().apply("edu.sc.seis.launch4j"); - project.getExtensions().create(SETTINGS_EXT_NAME, PackagePluginExtension.class, project); + project.getExtensions().create(SETTINGS_EXT_NAME, GradlePackagerSettings.class, project); project.getTasks().create(PACKAGE_TASK_NAME, DefaultPackageTask.class).dependsOn("build"); Context.getGradleContext().setLibraryTask(project.getTasks().create("launch4j_" + UUID.randomUUID(), Launch4jLibraryTask.class)); diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePluginExtension.java b/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePluginExtension.java deleted file mode 100644 index e4a311b8..00000000 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePluginExtension.java +++ /dev/null @@ -1,87 +0,0 @@ -package io.github.fvarrui.javapackager.gradle; - -import java.io.File; -import java.util.ArrayList; -import java.util.HashMap; - -import org.gradle.api.Project; - -import groovy.lang.Closure; -import io.github.fvarrui.javapackager.model.LinuxConfig; -import io.github.fvarrui.javapackager.model.MacConfig; -import io.github.fvarrui.javapackager.model.Manifest; -import io.github.fvarrui.javapackager.model.Platform; -import io.github.fvarrui.javapackager.model.Scripts; -import io.github.fvarrui.javapackager.model.WindowsConfig; -import io.github.fvarrui.javapackager.packagers.PackagerSettings; - -/** - * JavaPackager plugin extension for Gradle - */ -public class PackagePluginExtension extends PackagerSettings { - - private Project project; - - public PackagePluginExtension(Project project) { - super(); - this.project = project; - this.platform = Platform.auto; - this.additionalModules = new ArrayList<>(); - this.additionalModulePaths = new ArrayList<>(); - this.additionalResources = new ArrayList<>(); - this.administratorRequired = false; - this.assetsDir = new File(project.getProjectDir(), "assets"); - this.bundleJre = true; - this.copyDependencies = true; - this.createTarball = false; - this.createZipball = false; - this.customizedJre = true; - this.description = project.getDescription(); - this.extra = new HashMap<>(); - this.generateInstaller = true; - this.jreDirectoryName = "jre"; - this.linuxConfig = new LinuxConfig(); - this.macConfig = new MacConfig(); - this.manifest = new Manifest(); - this.modules = new ArrayList<>(); - this.name = project.getName(); - this.organizationEmail = ""; - this.useResourcesAsWorkingDir = true; - this.vmArgs = new ArrayList<>(); - this.winConfig = new WindowsConfig(); - this.outputDirectory = project.getBuildDir(); - this.scripts = new Scripts(); - this.forceInstaller = false; - } - - public LinuxConfig linuxConfig(Closure closure) { - linuxConfig = new LinuxConfig(); - project.configure(linuxConfig, closure); - return linuxConfig; - } - - public MacConfig macConfig(Closure closure) { - macConfig = new MacConfig(); - project.configure(macConfig, closure); - return macConfig; - } - - public WindowsConfig winConfig(Closure closure) { - winConfig = new WindowsConfig(); - project.configure(winConfig, closure); - return winConfig; - } - - public Manifest manifest(Closure closure) { - manifest = new Manifest(); - project.configure(manifest, closure); - return manifest; - } - - public Scripts scripts(Closure closure) { - scripts = new Scripts(); - project.configure(scripts, closure); - return scripts; - } - -} \ No newline at end of file diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerSettings.java b/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerSettings.java index 0f4df076..7d1a03dd 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerSettings.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerSettings.java @@ -82,6 +82,12 @@ public class PackagerSettings { protected File jdkPath; @Input @Optional + protected String jdkVersion; + @Input + @Optional + protected String jdkVendor; + @Input + @Optional protected List additionalResources; @Input @Optional diff --git a/src/main/java/io/github/fvarrui/javapackager/utils/NativeUtils.java b/src/main/java/io/github/fvarrui/javapackager/utils/NativeUtils.java new file mode 100644 index 00000000..5d93120e --- /dev/null +++ b/src/main/java/io/github/fvarrui/javapackager/utils/NativeUtils.java @@ -0,0 +1,9 @@ +package io.github.fvarrui.javapackager.utils; + +import java.io.File; + +public class NativeUtils { + public static File getUserTempFolder(){ + return new File(System.getProperty("java.io.tmpdir")); + } +} From 4ead00ea9e32c75cfcb63030a257f3de7d5d3fc8 Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Mon, 1 Aug 2022 20:15:39 +0200 Subject: [PATCH 15/74] added java updater --- build.gradle | 3 + .../javapackager/packagers/Packager.java | 5 +- .../packagers/PackagerSettings.java | 4 +- .../javapackager/utils/NativeUtils.java | 6 +- .../utils/updater/AdoptV3API.java | 208 ++++++++++++++++++ .../javapackager/utils/updater/Json.java | 105 +++++++++ .../utils/updater/TaskJavaDownload.java | 187 ++++++++++++++++ .../utils/updater/TaskJavaUpdater.java | 170 ++++++++++++++ 8 files changed, 684 insertions(+), 4 deletions(-) create mode 100644 src/main/java/io/github/fvarrui/javapackager/utils/updater/AdoptV3API.java create mode 100644 src/main/java/io/github/fvarrui/javapackager/utils/updater/Json.java create mode 100644 src/main/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaDownload.java create mode 100644 src/main/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdater.java diff --git a/build.gradle b/build.gradle index af811bca..7cc61844 100644 --- a/build.gradle +++ b/build.gradle @@ -55,6 +55,9 @@ dependencies { implementation 'net.jsign:jsign-core:3.1' implementation 'org.redline-rpm:redline:1.2.10' implementation 'io.github.fvarrui:launch4j:2.5.2' + implementation 'com.google.code.gson:gson:2.9.0' + implementation 'com.squareup.okhttp3:okhttp:4.10.0' + implementation 'org.rauschig:jarchivelib:1.2.0' testImplementation 'junit:junit:4.12' diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/Packager.java b/src/main/java/io/github/fvarrui/javapackager/packagers/Packager.java index 63f64d58..178c030e 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/Packager.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/Packager.java @@ -15,6 +15,7 @@ import io.github.fvarrui.javapackager.utils.IconUtils; import io.github.fvarrui.javapackager.utils.Logger; import io.github.fvarrui.javapackager.utils.VelocityUtils; +import io.github.fvarrui.javapackager.utils.updater.TaskJavaUpdater; /** * Packager base class @@ -123,7 +124,9 @@ private void init() throws Exception { // sets jdkPath by default if not specified if (jdkPath == null) { - jdkPath = new File(System.getProperty("java.home")); + TaskJavaUpdater taskJavaUpdater = new TaskJavaUpdater(platform); + taskJavaUpdater.execute(jdkVersion); + jdkPath = taskJavaUpdater.jdkPath; } if (!jdkPath.exists()) { throw new Exception("JDK path doesn't exist: " + jdkPath); diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerSettings.java b/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerSettings.java index 7d1a03dd..40b3f68c 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerSettings.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerSettings.java @@ -82,10 +82,10 @@ public class PackagerSettings { protected File jdkPath; @Input @Optional - protected String jdkVersion; + protected String jdkVersion = "8"; @Input @Optional - protected String jdkVendor; + protected String jdkVendor = "temurin"; @Input @Optional protected List additionalResources; diff --git a/src/main/java/io/github/fvarrui/javapackager/utils/NativeUtils.java b/src/main/java/io/github/fvarrui/javapackager/utils/NativeUtils.java index 5d93120e..d9562c4f 100644 --- a/src/main/java/io/github/fvarrui/javapackager/utils/NativeUtils.java +++ b/src/main/java/io/github/fvarrui/javapackager/utils/NativeUtils.java @@ -3,7 +3,11 @@ import java.io.File; public class NativeUtils { + /** + * @return JavaPackager temp directory. Example on Windows:
+ * C:\Users\Name\AppData\Local\Temp\JavaPackager + */ public static File getUserTempFolder(){ - return new File(System.getProperty("java.io.tmpdir")); + return new File(System.getProperty("java.io.tmpdir") +"/JavaPackager"); } } diff --git a/src/main/java/io/github/fvarrui/javapackager/utils/updater/AdoptV3API.java b/src/main/java/io/github/fvarrui/javapackager/utils/updater/AdoptV3API.java new file mode 100644 index 00000000..51852930 --- /dev/null +++ b/src/main/java/io/github/fvarrui/javapackager/utils/updater/AdoptV3API.java @@ -0,0 +1,208 @@ +/* + * Copyright (c) 2021-2022 Osiris-Team. + * All rights reserved. + * + * This software is copyrighted work, licensed under the terms + * of the MIT-License. Consult the "LICENSE" file for details. + */ + +package io.github.fvarrui.javapackager.utils.updater; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; + +import java.io.IOException; + +/** + * Details here: https://api.adoptium.net/q/swagger-ui + */ +public class AdoptV3API { + private final String START_DOWNLOAD_URL = "https://api.adoptium.net/v3/binary/version/"; + private final String START_RELEASES_URL = "https://api.adoptium.net/v3/info/release_versions?architecture="; + private final String START_ASSETS_URL = "https://api.adoptium.net/v3/assets/version/"; + + /** + * Creates and returns a new url from the provided parameters.
+ * For a list of all available parameters types see: https://api.adoptium.net/q/swagger-ui/#/Assets/searchReleasesByVersion + * + * @param releaseVersionName Example: 11.0.4.1+11.1 + * @param isLargeHeapSize If true allows your jvm to use more that 57gb of ram. + * @param isHotspotImpl If true uses hotspot, otherwise the openj9 implementation. + * @param isOnlyLTS If true only shows LTS (Long Term Support) releases. + * @param maxItems Example: 20 + * @return + */ + public String getVersionInformationUrl(String releaseVersionName, OperatingSystemArchitectureType osArchitectureType, boolean isLargeHeapSize, ImageType imageType, + boolean isHotspotImpl, boolean isOnlyLTS, OperatingSystemType osType, int maxItems, + VendorProjectType vendorProject, ReleaseType releaseType) { + String jvmImplementation = isHotspotImpl ? "hotspot" : "openj9"; + String heapSize = isLargeHeapSize ? "large" : "normal"; + return START_ASSETS_URL + + releaseVersionName + + "?architecture=" + osArchitectureType.name + + "&heap_size=" + heapSize + + "&image_type=" + imageType.name + + "&jvm_impl=" + jvmImplementation + + "<s=" + isOnlyLTS + + "&os=" + osType.name + + "&page=0" + + "&page_size=" + maxItems + + "&project=" + vendorProject.name + + "&release_type=" + releaseType.name + + "&sort_method=DEFAULT&sort_order=DESC" + + "&vendor=eclipse"; + } + + public JsonArray getVersionInformation(String releaseVersionName, OperatingSystemArchitectureType osArchitectureType, boolean isLargeHeapSize, ImageType imageType, + boolean isHotspotImpl, boolean isOnlyLTS, OperatingSystemType osType, int maxItems, + VendorProjectType vendorProject, ReleaseType releaseType) throws IOException { + return Json.fromUrlAsJsonArray(getVersionInformationUrl( + releaseVersionName, osArchitectureType, isLargeHeapSize, imageType, isHotspotImpl, + isOnlyLTS, osType, maxItems, vendorProject, releaseType + )); + } + + /** + * Creates and returns a new url from the provided parameters.
+ * For a list of all available parameters types see: https://api.adoptium.net/q/swagger-ui/#/Release%20Info/getReleaseVersions + * + * @param isLargeHeapSize If true allows your jvm to use more that 57gb of ram. + * @param isHotspotImpl If true uses hotspot, otherwise the openj9 implementation. + * @param isOnlyLTS If true only shows LTS (Long Term Support) releases. + * @param maxItems Example: 20 + * @return + */ + public String getReleasesUrl(OperatingSystemArchitectureType osArchitectureType, boolean isLargeHeapSize, ImageType imageType, + boolean isHotspotImpl, boolean isOnlyLTS, OperatingSystemType osType, int maxItems, + VendorProjectType vendorProject, ReleaseType releaseType) { + String jvmImplementation = isHotspotImpl ? "hotspot" : "openj9"; + String heapSize = isLargeHeapSize ? "large" : "normal"; + return START_RELEASES_URL + + osArchitectureType.name + + "&heap_size=" + heapSize + + "&image_type=" + imageType.name + + "&jvm_impl=" + jvmImplementation + + "<s=" + isOnlyLTS + + "&os=" + osType.name + + "&page=0" + + "&page_size=" + maxItems + + "&project=" + vendorProject.name + + "&release_type=" + releaseType.name + + "&sort_method=DEFAULT&sort_order=DESC" + + "&vendor=eclipse"; + } + + public JsonObject getReleases(OperatingSystemArchitectureType osArchitectureType, boolean isLargeHeapSize, ImageType imageType, + boolean isHotspotImpl, boolean isOnlyLTS, OperatingSystemType osType, int maxItems, + VendorProjectType vendorProject, ReleaseType releaseType) throws IOException { + return Json.fromUrlAsObject(getReleasesUrl(osArchitectureType, isLargeHeapSize, imageType, + isHotspotImpl, isOnlyLTS, osType, maxItems, vendorProject, releaseType)); + } + + /** + * Creates and returns a new url from the provided parameters.
+ * For a list of all available parameters types see: https://api.adoptium.net/q/swagger-ui/#/Binary/getBinaryByVersion + * + * @param releaseName Note that this is not the regular version name. Example: jdk-15.0.2+7 + * @param isHotspotImpl If true uses hotspot, otherwise the openj9 implementation. + * @param isLargeHeapSize If true allows your jvm to use more that 57gb of ram. + */ + public String getDownloadUrl(String releaseName, OperatingSystemType osType, OperatingSystemArchitectureType osArchitectureType, + ImageType imageType, boolean isHotspotImpl, boolean isLargeHeapSize, + VendorProjectType vendorProject) { + String jvmImplementation = isHotspotImpl ? "hotspot" : "openj9"; + String heapSize = isLargeHeapSize ? "large" : "normal"; + return START_DOWNLOAD_URL + + releaseName + "/" + + osType.name + "/" + + osArchitectureType.name + "/" + + imageType.name + "/" + + jvmImplementation + "/" + + heapSize + "/" + + "eclipse?project=" + vendorProject.name; + } + + + // ENUMS: + + + public enum VendorProjectType { + JDK("jdk"), + VALHALLA("valhalla"), + METROPOLIS("metropolis"), + JFR("jfr"), + SHENANDOAH("shenandoah"); + + private final String name; + + VendorProjectType(String name) { + this.name = name; + } + } + + public enum ImageType { + JDK("jdk"), + JRE("jre"), + TEST_IMAGE("testimage"), + DEBUG_IMAGE("debugimage"), + STATIC_LIBS("staticlibs"); + + private final String name; + + ImageType(String name) { + this.name = name; + } + } + + public enum OperatingSystemArchitectureType { + X64("x64"), + X86("x86"), + X32("x32"), + PPC64("ppc64"), + PPC64LE("ppc64le"), + S390X("s390x"), + AARCH64("aarch64"), + ARM("arm"), + SPARCV9("sparcv9"), + RISCV64("riscv64"), + // x64 with alternative names: + AMD64("x64"), + X86_64("x64"), + // x32 with alternative names: + I386("x32"), + // AARCHx64 with alternative names: + ARM64("aarch64"); + + private final String name; + + OperatingSystemArchitectureType(String name) { + this.name = name; + } + } + + public enum OperatingSystemType { + LINUX("linux"), + WINDOWS("windows"), + MAC("mac"), + SOLARIS("solaris"), + AIX("aix"), + ALPINE_LINUX("alpine-linux"); + + private final String name; + + OperatingSystemType(String name) { + this.name = name; + } + } + + public enum ReleaseType { + GENERAL_AVAILABILITY("ga"), + EARLY_ACCESS("ea"); + + private final String name; + + ReleaseType(String name) { + this.name = name; + } + } +} diff --git a/src/main/java/io/github/fvarrui/javapackager/utils/updater/Json.java b/src/main/java/io/github/fvarrui/javapackager/utils/updater/Json.java new file mode 100644 index 00000000..88fcce46 --- /dev/null +++ b/src/main/java/io/github/fvarrui/javapackager/utils/updater/Json.java @@ -0,0 +1,105 @@ +package io.github.fvarrui.javapackager.utils.updater; + +import com.google.gson.*; + +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; + +public class Json { + + /** + * Reads/Parses the provided String to a {@link JsonElement}. + */ + public static JsonElement from(String s){ + return JsonParser.parseString(s); + } + + /** + * Writes/Parses the provided {@link JsonElement} to a String. + */ + public static String toString(JsonElement el){ + return new Gson().toJson(el); + } + + /** + * Returns the json-element. This can be a json-array or a json-object. + * + * @param url The url which leads to the json file. + * @return JsonElement + * @throws Exception When status code other than 200. + */ + public static JsonElement fromUrl(String url) throws IOException { + HttpURLConnection con = null; + JsonElement element; + try { + con = (HttpURLConnection) new URL(url).openConnection(); + con.addRequestProperty("User-Agent", "JavaPackager"); + con.setConnectTimeout(1000); + con.connect(); + + if (con.getResponseCode() == 200) { + try (InputStreamReader inr = new InputStreamReader(con.getInputStream())) { + element = JsonParser.parseReader(inr); + } + } else { + throw new IOException("error: "+con.getResponseCode()+" message: \""+con.getResponseMessage()+ "\" url: " + url); + } + } catch (IOException e) { + if (con != null) con.disconnect(); + throw e; + } finally { + if (con != null) con.disconnect(); + } + return element; + } + + public static JsonArray fromUrlAsJsonArray(String url) throws IOException { + JsonElement element = fromUrl(url); + if (element != null && element.isJsonArray()) { + return element.getAsJsonArray(); + } else { + throw new IOException("Its not a json array! Check it out -> " + url); + } + } + + /** + * Turns a JsonArray with its objects into a list. + * + * @param url The url where to find the json file. + * @return A list with JsonObjects or null if there was a error with the url. + */ + public static List fromUrlAsList(String url) throws IOException { + List objectList = new ArrayList<>(); + JsonElement element = fromUrl(url); + if (element != null && element.isJsonArray()) { + final JsonArray ja = element.getAsJsonArray(); + for (int i = 0; i < ja.size(); i++) { + JsonObject jo = ja.get(i).getAsJsonObject(); + objectList.add(jo); + } + return objectList; + } else { + throw new IOException("Its not a json array! Check it out -> " + url); + } + } + + /** + * Gets a single JsonObject. + * + * @param url The url where to find the json file. + * @return A JsonObject or null if there was a error with the url. + */ + public static JsonObject fromUrlAsObject(String url) throws IOException { + JsonElement element = fromUrl(url); + if (element != null && element.isJsonObject()) { + return element.getAsJsonObject(); + } else { + throw new IOException("Its not a json object! Check it out -> " + url); + } + } + +} diff --git a/src/main/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaDownload.java b/src/main/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaDownload.java new file mode 100644 index 00000000..1f44f4a6 --- /dev/null +++ b/src/main/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaDownload.java @@ -0,0 +1,187 @@ +/* + * Copyright (c) 2021-2022 Osiris-Team. + * All rights reserved. + * + * This software is copyrighted work, licensed under the terms + * of the MIT-License. Consult the "LICENSE" file for details. + */ + +package io.github.fvarrui.javapackager.utils.updater; + +import io.github.fvarrui.javapackager.utils.Logger; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.ResponseBody; +import org.apache.commons.io.FileUtils; +import org.jetbrains.annotations.NotNull; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; +import java.security.MessageDigest; +import java.util.Random; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class TaskJavaDownload { + private File newDest; + private boolean isTar; + private String url; + private File dest; + private AdoptV3API.OperatingSystemType osType; + + /** + * @param url the download-url. + * @param dest the downloads final destination. Note that the file name must end with '.file', because + * the actual file type gets set when there is download information available. + */ + public void execute(String url, File dest, AdoptV3API.OperatingSystemType osType) throws Exception { + this.url = url; + this.dest = dest; + this.osType = osType; + + String fileName = dest.getName(); + Logger.info("Fetching file " + fileName + " from: " + url); + + Request request = new Request.Builder().url(url) + .header("User-Agent", "AutoPlug Client/" + new Random().nextInt() + " - https://autoplug.one") + .build(); + Response response = new OkHttpClient().newCall(request).execute(); + ResponseBody body = null; + try { + if (response.code() != 200) + throw new Exception("Download of '" + fileName + "' failed! Code: " + response.code() + " Message: " + response.message() + " Url: " + url); + + body = response.body(); + if (body == null) + throw new Exception("Download of '" + fileName + "' failed because of null response body!"); + else if (body.contentType() == null) + throw new Exception("Download of '" + fileName + "' failed because of null content type!"); + else if (!body.contentType().type().equals("application")) + throw new Exception("Download of '" + fileName + "' failed because of invalid content type: " + body.contentType().type()); + else if (!body.contentType().subtype().equals("java-archive") + && !body.contentType().subtype().equals("jar") + && !body.contentType().subtype().equals("octet-stream") + && !body.contentType().subtype().equals("x-gtar") // ADDITIONS FOR JAVA DOWNLOADS + && !body.contentType().subtype().equals("zip")) + throw new Exception("Download of '" + fileName + "' failed because of invalid sub-content type: " + body.contentType().subtype()); + + // Set the file name + if (body.contentType().subtype().equals("x-gtar")) { + isTar = true; + fileName = fileName.replace(".file", ".tar.gz"); + } else { + // In this case we check the response header for file information + // Example: (content-disposition, attachment; filename=JDK15U-jre_x86-32_windows_hotspot_15.0.2_7.zip) + String contentDispo = response.headers().get("content-disposition"); + if (contentDispo == null) + throw new Exception("Failed to determine download file type!"); + + if (contentDispo.contains(".tar.gz")) { + isTar = true; + fileName = fileName.replace(".file", ".tar.gz"); + } else { + Pattern p = Pattern.compile("[.][^.]+$"); // Returns the file extension with dot. example.txt -> .txt + Matcher m = p.matcher(contentDispo); + if (m.find()) { + String fileExtension = m.group(); + fileName = fileName.replace(".file", fileExtension); + } else + throw new Exception("Failed to determine download file type! Download-Url: " + contentDispo); + } + } + + + // We need to at least create the cache dest to then rename it + if (dest.exists()) dest.delete(); + dest.getParentFile().mkdirs(); + dest.createNewFile(); + + // The actual file with the correct file extension + newDest = new File(dest.getParentFile().getAbsolutePath() + "/" + fileName); + if (newDest.exists()) newDest.delete(); + newDest.getParentFile().mkdirs(); + newDest.createNewFile(); + + long completeFileSize = body.contentLength(); + + BufferedInputStream in = new BufferedInputStream(body.byteStream()); + FileOutputStream fos = new FileOutputStream(dest); + BufferedOutputStream bout = new BufferedOutputStream(fos, 1024); + byte[] data = new byte[1024]; + long downloadedFileSize = 0; + int x = 0; + Logger.info("Downloading " + fileName + " with " + completeFileSize / (1024 * 1024) + "mb. This may take a bit..."); + while ((x = in.read(data, 0, 1024)) >= 0) { + downloadedFileSize += x; + bout.write(data, 0, x); + } + + Logger.info("Downloaded " + fileName + " (" + downloadedFileSize / (1024 * 1024) + "mb/" + completeFileSize / (1024 * 1024) + "mb)"); + bout.close(); + in.close(); + body.close(); + response.close(); + + Files.copy(dest.toPath(), newDest.toPath(), StandardCopyOption.REPLACE_EXISTING); + } catch (Exception e) { + if (body != null) body.close(); + response.close(); + throw e; + } + } + + /** + * Retrieve this once the task finished to get a correct result. + */ + public boolean isTar() { + return isTar; + } + + public File getNewCacheDest() { + return newDest; + } + + /** + * Only use this method after finishing the download. + * It will get the hash for the newly downloaded file and + * compare it with the given hash. + * + * @param sha256 + * @return true if the hashes match + */ + public boolean compareWithSHA256(String sha256) { + try { + MessageDigest digest = MessageDigest.getInstance("SHA-256"); + byte[] encodedhash = digest.digest( + FileUtils.readFileToByteArray(dest)); + final String hashResult = bytesToHex(encodedhash); + Logger.debug("Comparing hashes (SHA-256):"); + Logger.debug("Expected hash: " + sha256); + Logger.debug("Actual hash: " + hashResult); + return hashResult.equals(sha256); + } catch (Exception e) { + Logger.error("Failed to compare hashes.", e); + return false; + } + + } + + @NotNull + private String bytesToHex(@NotNull byte[] hash) { + StringBuilder hexString = new StringBuilder(2 * hash.length); + for (int i = 0; i < hash.length; i++) { + String hex = Integer.toHexString(0xff & hash[i]); + if (hex.length() == 1) { + hexString.append('0'); + } + hexString.append(hex); + } + return hexString.toString(); + } + +} diff --git a/src/main/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdater.java b/src/main/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdater.java new file mode 100644 index 00000000..a23c0c5d --- /dev/null +++ b/src/main/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdater.java @@ -0,0 +1,170 @@ +/* + * Copyright (c) 2021-2022 Osiris-Team. + * All rights reserved. + * + * This software is copyrighted work, licensed under the terms + * of the MIT-License. Consult the "LICENSE" file for details. + */ + +package io.github.fvarrui.javapackager.utils.updater; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import io.github.fvarrui.javapackager.model.Platform; +import io.github.fvarrui.javapackager.utils.Logger; +import io.github.fvarrui.javapackager.utils.NativeUtils; +import org.apache.commons.io.FileUtils; +import org.rauschig.jarchivelib.ArchiveFormat; +import org.rauschig.jarchivelib.Archiver; +import org.rauschig.jarchivelib.ArchiverFactory; +import org.rauschig.jarchivelib.CompressionType; + +import java.io.File; +import java.io.IOException; +import java.util.Arrays; +import java.util.Properties; + +/** + * Searches for updates and installs them is AUTOMATIC profile is selected. + */ +public class TaskJavaUpdater { + + public File downloadsDir = new File(NativeUtils.getUserTempFolder()+"/downloads"); + public File jdkPath; + public AdoptV3API.OperatingSystemType osType; + + public TaskJavaUpdater(Platform platform) { + switch (platform) { + case linux: + jdkPath = new File(NativeUtils.getUserTempFolder()+"/jdk/linux"); + osType = AdoptV3API.OperatingSystemType.LINUX; + break; + case mac: + jdkPath = new File(NativeUtils.getUserTempFolder()+"/jdk/mac"); + osType = AdoptV3API.OperatingSystemType.MAC; + break; + case windows: + jdkPath = new File(NativeUtils.getUserTempFolder()+"/jdk/win"); + osType = AdoptV3API.OperatingSystemType.WINDOWS; + break; + default: + } + jdkPath.mkdirs(); + } + + public void execute(String javaVersion) throws Exception { + Logger.info("Checking java installation..."); + AdoptV3API.OperatingSystemArchitectureType osArchitectureType = AdoptV3API.OperatingSystemArchitectureType.X64; + boolean isLargeHeapSize = false; + int currentBuildId = getBuildID(); + AdoptV3API.ImageType imageType = AdoptV3API.ImageType.JDK; + + JsonObject jsonReleases = new AdoptV3API().getReleases( + osArchitectureType, + isLargeHeapSize, + imageType, + true, + true, // Changing this to false makes the api return even fewer versions, which is pretty weird. + osType, + 50, + AdoptV3API.VendorProjectType.JDK, + AdoptV3API.ReleaseType.GENERAL_AVAILABILITY + ); + + JsonObject jsonLatestRelease = null; + for (JsonElement e : + jsonReleases.getAsJsonArray("versions")) { + JsonObject o = e.getAsJsonObject(); + if (o.get("major").getAsString().equals(javaVersion)) { + jsonLatestRelease = o; + break; + } + } + + if (jsonLatestRelease == null){ + Logger.error("Couldn't find a matching major version to '" + javaVersion + "'."); + return; + } + + int latestBuildId = jsonLatestRelease.get("build").getAsInt(); + if (latestBuildId <= currentBuildId) { + Logger.info("Your Java installation is on the latest version!"); + return; + } + + // semver = the version string like: 11.0.0+28 for example // Not a typo ^-^ + String versionString = jsonLatestRelease.get("semver").toString().replace("\"", ""); // Returns with apostrophes "" + + JsonArray jsonVersionDetails = new AdoptV3API().getVersionInformation( + versionString, + osArchitectureType, + isLargeHeapSize, + imageType, + true, + true, + osType, + 50, + AdoptV3API.VendorProjectType.JDK, + AdoptV3API.ReleaseType.GENERAL_AVAILABILITY); + + String checksum = jsonVersionDetails.get(0).getAsJsonObject().getAsJsonArray("binaries") + .get(0).getAsJsonObject().get("package").getAsJsonObject().get("checksum").getAsString(); + + // The release name that can be used to retrieve the download link + String releaseName = jsonVersionDetails.get(0).getAsJsonObject().get("release_name").getAsString(); + String downloadURL = new AdoptV3API().getDownloadUrl( + releaseName, + osType, + osArchitectureType, + imageType, + true, + isLargeHeapSize, + AdoptV3API.VendorProjectType.JDK + ); + + Logger.info("Update found " + currentBuildId + " -> " + latestBuildId); + File final_dir_dest = jdkPath; + File cache_dest = new File(downloadsDir + "/" + imageType + "-" + versionString + ".file"); + TaskJavaDownload download = new TaskJavaDownload(); + download.execute(downloadURL, cache_dest, osType); + + Logger.info("Java update downloaded. Checking hash..."); + if(!download.compareWithSHA256(checksum)) + throw new IOException("Hash of downloaded Java update is not valid!"); + Logger.info("Hash is valid, removing old installation..."); + FileUtils.deleteDirectory(final_dir_dest); + final_dir_dest.mkdirs(); + + Archiver archiver; + if (download.isTar()) + archiver = ArchiverFactory.createArchiver(ArchiveFormat.TAR, CompressionType.GZIP); + else // A zip + archiver = ArchiverFactory.createArchiver(ArchiveFormat.ZIP); + + archiver.extract(download.getNewCacheDest(), final_dir_dest); + FileUtils.deleteDirectory(downloadsDir); + Logger.info("Java update was installed successfully (" + currentBuildId + " -> " + latestBuildId + ") at "+jdkPath); + } + + private int getBuildID() throws IOException { + for (File file : jdkPath.listFiles()) { + if(file.getName().startsWith("java_packager_build_id ")){ + return Integer.parseInt(file.getName().split(" ")[1]); + } + } + setBuildID(0); + return 0; + } + + private void setBuildID(int id) throws IOException { + for (File file : jdkPath.listFiles()) { + if(file.getName().startsWith("java_packager_build_id ")){ + file.delete(); + } + } + File file = new File(jdkPath+"/java_packager_build_id "+id); + file.createNewFile(); + } + +} From b81460ee1bd4bea113e9dc09fed9438aee1dab3d Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Mon, 1 Aug 2022 20:16:28 +0200 Subject: [PATCH 16/74] buildId --- .../fvarrui/javapackager/utils/updater/TaskJavaUpdater.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdater.java b/src/main/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdater.java index a23c0c5d..bb6bc302 100644 --- a/src/main/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdater.java +++ b/src/main/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdater.java @@ -143,6 +143,7 @@ public void execute(String javaVersion) throws Exception { archiver = ArchiverFactory.createArchiver(ArchiveFormat.ZIP); archiver.extract(download.getNewCacheDest(), final_dir_dest); + setBuildID(latestBuildId); FileUtils.deleteDirectory(downloadsDir); Logger.info("Java update was installed successfully (" + currentBuildId + " -> " + latestBuildId + ") at "+jdkPath); } From 114b5e311ac69eb270895b1b2c69c32f3c232a8d Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Tue, 2 Aug 2022 13:06:50 +0200 Subject: [PATCH 17/74] added check for java vendor --- .../io/github/fvarrui/javapackager/packagers/Packager.java | 2 +- .../fvarrui/javapackager/utils/updater/TaskJavaUpdater.java | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/Packager.java b/src/main/java/io/github/fvarrui/javapackager/packagers/Packager.java index 178c030e..fb9326de 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/Packager.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/Packager.java @@ -125,7 +125,7 @@ private void init() throws Exception { // sets jdkPath by default if not specified if (jdkPath == null) { TaskJavaUpdater taskJavaUpdater = new TaskJavaUpdater(platform); - taskJavaUpdater.execute(jdkVersion); + taskJavaUpdater.execute(jdkVersion, jdkVendor); jdkPath = taskJavaUpdater.jdkPath; } if (!jdkPath.exists()) { diff --git a/src/main/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdater.java b/src/main/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdater.java index bb6bc302..2573cb05 100644 --- a/src/main/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdater.java +++ b/src/main/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdater.java @@ -23,6 +23,7 @@ import java.io.File; import java.io.IOException; import java.util.Arrays; +import java.util.Objects; import java.util.Properties; /** @@ -53,7 +54,10 @@ public TaskJavaUpdater(Platform platform) { jdkPath.mkdirs(); } - public void execute(String javaVersion) throws Exception { + public void execute(String javaVersion, String javaVendor) throws Exception { + Objects.requireNonNull(javaVersion); + Objects.requireNonNull(javaVendor); + if(!javaVendor.equals("temurin")) throw new IllegalArgumentException("The provided Java vendor '"+javaVendor+"' is currently not supported!"); Logger.info("Checking java installation..."); AdoptV3API.OperatingSystemArchitectureType osArchitectureType = AdoptV3API.OperatingSystemArchitectureType.X64; boolean isLargeHeapSize = false; From fea9507c792339e8aeec1ff0f7620e0c630eebab Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Tue, 2 Aug 2022 13:08:32 +0200 Subject: [PATCH 18/74] readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index eff203a5..6f8e9e0b 100644 --- a/README.md +++ b/README.md @@ -198,7 +198,7 @@ By default it will generate next artifacts in `${outputDirectory} ` folder: ### Plugin assets -Any [asset used by JavaPackager](https://github.com/fvarrui/JavaPackager/tree/master/src/main/resources), such as application icons or templates, can be replaced just by placing a file with the same name in `${assetsDir}` folder organized by platform. +Any [asset used by JavaPackager]([JavaPackager/src/main/resources at master · fvarrui/JavaPackager · GitHub](https://github.com/fvarrui/JavaPackager/tree/master/src/main/resources)), such as application icons or templates, can be replaced just by placing a file with the same name in `${assetsDir}` folder organized by platform. ```bash ${assetsDir}/ From bca30f056327bb4f312495c7041af3f616ad10cc Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Tue, 2 Aug 2022 13:50:55 +0200 Subject: [PATCH 19/74] reset stuff I don't understand --- .../gradle/DefaultPackageTask.java | 98 +-- .../gradle/GradlePackagerSettings.java | 132 ---- .../javapackager/gradle/PackagePlugin.java | 2 +- .../gradle/PackagePluginExtension.java | 87 +++ .../javapackager/gradle/PackageTask.java | 613 +++++++++++++++++- .../packagers/PackagerSettings.java | 110 +--- .../javapackager/utils/DownloadUtils.java | 5 - .../utils/updater/TaskJavaUpdater.java | 2 +- 8 files changed, 755 insertions(+), 294 deletions(-) delete mode 100644 src/main/java/io/github/fvarrui/javapackager/gradle/GradlePackagerSettings.java create mode 100644 src/main/java/io/github/fvarrui/javapackager/gradle/PackagePluginExtension.java delete mode 100644 src/main/java/io/github/fvarrui/javapackager/utils/DownloadUtils.java diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/DefaultPackageTask.java b/src/main/java/io/github/fvarrui/javapackager/gradle/DefaultPackageTask.java index cddb3571..34a7b434 100644 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/DefaultPackageTask.java +++ b/src/main/java/io/github/fvarrui/javapackager/gradle/DefaultPackageTask.java @@ -9,57 +9,57 @@ * Default packaging task for Gradle */ public class DefaultPackageTask extends AbstractPackageTask { - + @Override protected Packager createPackager() throws Exception { - GradlePackagerSettings extension = getProject().getExtensions().findByType(GradlePackagerSettings.class); - - return - (Packager) PackagerFactory - .createPackager(extension.getPlatform()) - .additionalModules(extension.getAdditionalModules()) - .additionalModulePaths(extension.getAdditionalModulePaths()) - .additionalResources(extension.getAdditionalResources()) - .administratorRequired(extension.getAdministratorRequired()) - .assetsDir(extension.getAssetsDir()) - .bundleJre(extension.getBundleJre()) - .classpath(extension.getClasspath()) - .copyDependencies(extension.getCopyDependencies()) - .createTarball(extension.getCreateTarball()) - .createZipball(extension.getCreateZipball()) - .customizedJre(extension.getCustomizedJre()) - .description(extension.getDescription()) - .displayName(extension.getDisplayName()) - .envPath(extension.getEnvPath()) - .extra(extension.getExtra()) - .fileAssociations(extension.getFileAssociations()) - .forceInstaller(extension.isForceInstaller()) - .generateInstaller(extension.getGenerateInstaller()) - .jdkPath(extension.getJdkPath()) - .jreDirectoryName(extension.getJreDirectoryName()) - .jreMinVersion(extension.getJreMinVersion()) - .jrePath(extension.getJrePath()) - .licenseFile(extension.getLicenseFile()) - .linuxConfig(extension.getLinuxConfig()) - .macConfig(extension.getMacConfig()) - .mainClass(extension.getMainClass()) - .manifest(extension.getManifest()) - .modules(extension.getModules()) - .name(extension.getName()) - .organizationEmail(extension.getOrganizationEmail()) - .organizationName(extension.getOrganizationName()) - .organizationUrl(extension.getOrganizationUrl()) - .outputDirectory(extension.getOutputDirectory()) - .packagingJdk(extension.getPackagingJdk()) - .runnableJar(extension.getRunnableJar()) - .scripts(extension.getScripts()) - .useResourcesAsWorkingDir(extension.isUseResourcesAsWorkingDir()) - .url(extension.getUrl()) - .version(defaultIfNull(extension.getVersion(), getProject().getVersion().toString())) - .vmArgs(extension.getVmArgs()) - .winConfig(extension.getWinConfig()); + PackagePluginExtension extension = getProject().getExtensions().findByType(PackagePluginExtension.class); + + return + (Packager) PackagerFactory + .createPackager(extension.getPlatform()) + .additionalModules(extension.getAdditionalModules()) + .additionalModulePaths(extension.getAdditionalModulePaths()) + .additionalResources(extension.getAdditionalResources()) + .administratorRequired(extension.getAdministratorRequired()) + .assetsDir(extension.getAssetsDir()) + .bundleJre(extension.getBundleJre()) + .classpath(extension.getClasspath()) + .copyDependencies(extension.getCopyDependencies()) + .createTarball(extension.getCreateTarball()) + .createZipball(extension.getCreateZipball()) + .customizedJre(extension.getCustomizedJre()) + .description(extension.getDescription()) + .displayName(extension.getDisplayName()) + .envPath(extension.getEnvPath()) + .extra(extension.getExtra()) + .fileAssociations(extension.getFileAssociations()) + .forceInstaller(extension.isForceInstaller()) + .generateInstaller(extension.getGenerateInstaller()) + .jdkPath(extension.getJdkPath()) + .jreDirectoryName(extension.getJreDirectoryName()) + .jreMinVersion(extension.getJreMinVersion()) + .jrePath(extension.getJrePath()) + .licenseFile(extension.getLicenseFile()) + .linuxConfig(extension.getLinuxConfig()) + .macConfig(extension.getMacConfig()) + .mainClass(extension.getMainClass()) + .manifest(extension.getManifest()) + .modules(extension.getModules()) + .name(extension.getName()) + .organizationEmail(extension.getOrganizationEmail()) + .organizationName(extension.getOrganizationName()) + .organizationUrl(extension.getOrganizationUrl()) + .outputDirectory(extension.getOutputDirectory()) + .packagingJdk(extension.getPackagingJdk()) + .runnableJar(extension.getRunnableJar()) + .scripts(extension.getScripts()) + .useResourcesAsWorkingDir(extension.isUseResourcesAsWorkingDir()) + .url(extension.getUrl()) + .version(defaultIfNull(extension.getVersion(), getProject().getVersion().toString())) + .vmArgs(extension.getVmArgs()) + .winConfig(extension.getWinConfig()); } - -} + +} \ No newline at end of file diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/GradlePackagerSettings.java b/src/main/java/io/github/fvarrui/javapackager/gradle/GradlePackagerSettings.java deleted file mode 100644 index 9cb8a0a3..00000000 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/GradlePackagerSettings.java +++ /dev/null @@ -1,132 +0,0 @@ -package io.github.fvarrui.javapackager.gradle; - -import groovy.lang.Closure; -import io.github.fvarrui.javapackager.model.*; -import io.github.fvarrui.javapackager.packagers.Context; -import io.github.fvarrui.javapackager.packagers.Packager; -import io.github.fvarrui.javapackager.packagers.PackagerFactory; -import io.github.fvarrui.javapackager.packagers.PackagerSettings; - -import java.io.File; -import java.util.ArrayList; -import java.util.HashMap; - -import static io.github.fvarrui.javapackager.utils.ObjectUtils.defaultIfBlank; -import static io.github.fvarrui.javapackager.utils.ObjectUtils.defaultIfNull; - -public class GradlePackagerSettings extends PackagerSettings { - PackageTask packageTask; - - public GradlePackagerSettings(PackageTask packageTask) { - this.packageTask = packageTask; - this.platform = Platform.auto; - this.additionalModules = new ArrayList<>(); - this.additionalModulePaths = new ArrayList<>(); - this.additionalResources = new ArrayList<>(); - this.administratorRequired = false; - this.assetsDir = new File(packageTask.getProject().getProjectDir(), "assets"); - this.bundleJre = true; - this.copyDependencies = true; - this.createTarball = false; - this.createZipball = false; - this.customizedJre = true; - this.description = packageTask.getProject().getDescription(); - this.extra = new HashMap<>(); - this.generateInstaller = true; - this.jreDirectoryName = "jre"; - this.linuxConfig = new LinuxConfig(); - this.macConfig = new MacConfig(); - this.manifest = new Manifest(); - this.modules = new ArrayList<>(); - this.name = packageTask.getProject().getName(); - this.organizationEmail = ""; - this.useResourcesAsWorkingDir = true; - this.vmArgs = new ArrayList<>(); - this.winConfig = new WindowsConfig(); - this.outputDirectory = packageTask.getProject().getBuildDir(); - this.scripts = new Scripts(); - this.forceInstaller = false; - } - - public LinuxConfig linuxConfig(Closure closure) { - linuxConfig = new LinuxConfig(); - packageTask.getProject().configure(linuxConfig, closure); - return linuxConfig; - } - - public MacConfig macConfig(Closure closure) { - macConfig = new MacConfig(); - packageTask.getProject().configure(macConfig, closure); - return macConfig; - } - - public WindowsConfig winConfig(Closure closure) { - winConfig = new WindowsConfig(); - packageTask.getProject().configure(winConfig, closure); - return winConfig; - } - - public Manifest manifest(Closure closure) { - manifest = new Manifest(); - packageTask.getProject().configure(manifest, closure); - return manifest; - } - - public Scripts scripts(Closure closure) { - scripts = new Scripts(); - packageTask.getProject().configure(scripts, closure); - return scripts; - } - - @SuppressWarnings("unchecked") - public Packager createPackager() throws Exception { - - GradlePackagerSettings extension = packageTask.getProject().getExtensions().findByType(GradlePackagerSettings.class); - - return - (Packager) PackagerFactory - .createPackager(defaultIfNull(platform, extension.getPlatform())) - .additionalModules(defaultIfNull(additionalModules, extension.getAdditionalModules())) - .additionalModulePaths(defaultIfNull(additionalModulePaths, extension.getAdditionalModulePaths())) - .additionalResources(defaultIfNull(additionalResources, extension.getAdditionalResources())) - .administratorRequired(defaultIfNull(administratorRequired, extension.getAdministratorRequired())) - .assetsDir(defaultIfNull(assetsDir, extension.getAssetsDir())) - .bundleJre(defaultIfNull(bundleJre, extension.getBundleJre())) - .classpath(defaultIfNull(classpath, extension.getClasspath())) - .copyDependencies(defaultIfNull(copyDependencies, extension.getCopyDependencies())) - .createTarball(defaultIfNull(createTarball, extension.getCreateTarball())) - .createZipball(defaultIfNull(createZipball, extension.getCreateZipball())) - .customizedJre(defaultIfNull(customizedJre, extension.getCustomizedJre())) - .description(defaultIfNull(description, extension.getDescription())) - .displayName(defaultIfNull(displayName, extension.getDisplayName())) - .envPath(defaultIfNull(envPath, extension.getEnvPath())) - .extra(defaultIfNull(extra, extension.getExtra())) - .fileAssociations(defaultIfNull(fileAssociations, extension.getFileAssociations())) - .forceInstaller(defaultIfNull(forceInstaller, extension.isForceInstaller())) - .generateInstaller(defaultIfNull(generateInstaller, extension.getGenerateInstaller())) - .jdkPath(defaultIfNull(jdkPath, extension.getJdkPath())) - .jreDirectoryName(defaultIfBlank(jreDirectoryName, extension.getJreDirectoryName())) - .jreMinVersion(defaultIfBlank(jreMinVersion, extension.getJreMinVersion())) - .jrePath(defaultIfNull(jrePath, extension.getJrePath())) - .licenseFile(defaultIfNull(licenseFile, extension.getLicenseFile())) - .linuxConfig(defaultIfNull(linuxConfig, extension.getLinuxConfig())) - .macConfig(defaultIfNull(macConfig, extension.getMacConfig())) - .mainClass(defaultIfNull(mainClass, extension.getMainClass())) - .manifest(defaultIfNull(manifest, extension.getManifest())) - .modules(defaultIfNull(modules, extension.getModules())) - .name(defaultIfNull(name, extension.getName())) - .organizationEmail(defaultIfNull(organizationEmail, extension.getOrganizationEmail())) - .organizationName(defaultIfNull(organizationName, extension.getOrganizationName())) - .organizationUrl(defaultIfNull(organizationUrl, extension.getOrganizationUrl())) - .outputDirectory(defaultIfNull(outputDirectory, extension.getOutputDirectory())) - .packagingJdk(defaultIfNull(packagingJdk, extension.getPackagingJdk(), Context.getGradleContext().getDefaultToolchain())) - .runnableJar(defaultIfNull(runnableJar, extension.getRunnableJar())) - .scripts(defaultIfNull(scripts, extension.getScripts())) - .useResourcesAsWorkingDir(defaultIfNull(useResourcesAsWorkingDir, extension.isUseResourcesAsWorkingDir())) - .url(defaultIfNull(url, extension.getUrl())) - .version(defaultIfNull(version, extension.getVersion(), packageTask.getProject().getVersion().toString())) - .vmArgs(defaultIfNull(vmArgs, extension.getVmArgs())) - .winConfig(defaultIfNull(winConfig, extension.getWinConfig())) - .iconFile(defaultIfNull(iconFile, extension.getIconFile())); - } -} diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePlugin.java b/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePlugin.java index 001e71a8..acc47b3d 100644 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePlugin.java +++ b/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePlugin.java @@ -24,7 +24,7 @@ public void apply(Project project) { project.getPluginManager().apply("java"); project.getPluginManager().apply("edu.sc.seis.launch4j"); - project.getExtensions().create(SETTINGS_EXT_NAME, GradlePackagerSettings.class, project); + project.getExtensions().create(SETTINGS_EXT_NAME, PackagePluginExtension.class, project); project.getTasks().create(PACKAGE_TASK_NAME, DefaultPackageTask.class).dependsOn("build"); Context.getGradleContext().setLibraryTask(project.getTasks().create("launch4j_" + UUID.randomUUID(), Launch4jLibraryTask.class)); diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePluginExtension.java b/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePluginExtension.java new file mode 100644 index 00000000..6d555fc9 --- /dev/null +++ b/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePluginExtension.java @@ -0,0 +1,87 @@ +package io.github.fvarrui.javapackager.gradle; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; + +import org.gradle.api.Project; + +import groovy.lang.Closure; +import io.github.fvarrui.javapackager.model.LinuxConfig; +import io.github.fvarrui.javapackager.model.MacConfig; +import io.github.fvarrui.javapackager.model.Manifest; +import io.github.fvarrui.javapackager.model.Platform; +import io.github.fvarrui.javapackager.model.Scripts; +import io.github.fvarrui.javapackager.model.WindowsConfig; +import io.github.fvarrui.javapackager.packagers.PackagerSettings; + +/** + * JavaPackager plugin extension for Gradle + */ +public class PackagePluginExtension extends PackagerSettings { + + private Project project; + + public PackagePluginExtension(Project project) { + super(); + this.project = project; + this.platform = Platform.auto; + this.additionalModules = new ArrayList<>(); + this.additionalModulePaths = new ArrayList<>(); + this.additionalResources = new ArrayList<>(); + this.administratorRequired = false; + this.assetsDir = new File(project.getProjectDir(), "assets"); + this.bundleJre = true; + this.copyDependencies = true; + this.createTarball = false; + this.createZipball = false; + this.customizedJre = true; + this.description = project.getDescription(); + this.extra = new HashMap<>(); + this.generateInstaller = true; + this.jreDirectoryName = "jre"; + this.linuxConfig = new LinuxConfig(); + this.macConfig = new MacConfig(); + this.manifest = new Manifest(); + this.modules = new ArrayList<>(); + this.name = project.getName(); + this.organizationEmail = ""; + this.useResourcesAsWorkingDir = true; + this.vmArgs = new ArrayList<>(); + this.winConfig = new WindowsConfig(); + this.outputDirectory = project.getBuildDir(); + this.scripts = new Scripts(); + this.forceInstaller = false; + } + + public LinuxConfig linuxConfig(Closure closure) { + linuxConfig = new LinuxConfig(); + project.configure(linuxConfig, closure); + return linuxConfig; + } + + public MacConfig macConfig(Closure closure) { + macConfig = new MacConfig(); + project.configure(macConfig, closure); + return macConfig; + } + + public WindowsConfig winConfig(Closure closure) { + winConfig = new WindowsConfig(); + project.configure(winConfig, closure); + return winConfig; + } + + public Manifest manifest(Closure closure) { + manifest = new Manifest(); + project.configure(manifest, closure); + return manifest; + } + + public Scripts scripts(Closure closure) { + scripts = new Scripts(); + project.configure(scripts, closure); + return scripts; + } + +} \ No newline at end of file diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/PackageTask.java b/src/main/java/io/github/fvarrui/javapackager/gradle/PackageTask.java index a6b15423..217b4221 100644 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/PackageTask.java +++ b/src/main/java/io/github/fvarrui/javapackager/gradle/PackageTask.java @@ -1,17 +1,620 @@ package io.github.fvarrui.javapackager.gradle; +import static io.github.fvarrui.javapackager.utils.ObjectUtils.defaultIfBlank; +import static io.github.fvarrui.javapackager.utils.ObjectUtils.defaultIfNull; + +import java.io.File; +import java.util.List; +import java.util.Map; + +import org.gradle.api.tasks.Input; +import org.gradle.api.tasks.InputDirectory; +import org.gradle.api.tasks.InputFile; +import org.gradle.api.tasks.Optional; +import org.gradle.api.tasks.OutputDirectory; + +import groovy.lang.Closure; +import io.github.fvarrui.javapackager.model.FileAssociation; +import io.github.fvarrui.javapackager.model.LinuxConfig; +import io.github.fvarrui.javapackager.model.MacConfig; +import io.github.fvarrui.javapackager.model.Manifest; +import io.github.fvarrui.javapackager.model.Platform; +import io.github.fvarrui.javapackager.model.Scripts; +import io.github.fvarrui.javapackager.model.WindowsConfig; +import io.github.fvarrui.javapackager.packagers.Context; import io.github.fvarrui.javapackager.packagers.Packager; +import io.github.fvarrui.javapackager.packagers.PackagerFactory; /** - * Packaging task fro Gradle + * Packaging task fro Gradle */ public class PackageTask extends AbstractPackageTask { - public GradlePackagerSettings settings = new GradlePackagerSettings(this); + + // =============== + // task parameters + // =============== + + @Input + @Optional + private Platform platform; + + public Platform getPlatform() { + return platform; + } + + public void setPlatform(Platform platform) { + this.platform = platform; + } + + @Input + @Optional + private List additionalModules; + + public List getAdditionalModules() { + return additionalModules; + } + + public void setAdditionalModules(List additionalModules) { + this.additionalModules = additionalModules; + } + + @Input + @Optional + private List additionalResources; + + public List getAdditionalResources() { + return additionalResources; + } + + public void setAdditionalResources(List additionalResources) { + this.additionalResources = additionalResources; + } + + @Input + @Optional + private Boolean administratorRequired; + + public Boolean isAdministratorRequired() { + return administratorRequired; + } + + public void setAdministratorRequired(Boolean administratorRequired) { + this.administratorRequired = administratorRequired; + } + + @InputDirectory + @Optional + private File assetsDir; + + public File getAssetsDir() { + return assetsDir; + } + + public void setAssetsDir(File assetsDir) { + this.assetsDir = assetsDir; + } + + @InputDirectory + @Optional + private File packagingJdk; + + public File getPackagingJdk() { + return packagingJdk; + } + + public void setPackagingJdk(File packagingJdk) { + this.packagingJdk = packagingJdk; + } + + @Input + @Optional + private Boolean bundleJre; + + public Boolean isBundleJre() { + return bundleJre; + } + + public void setBundleJre(Boolean bundleJre) { + this.bundleJre = bundleJre; + } + + @Input + @Optional + private Boolean copyDependencies; + + public Boolean isCopyDependencies() { + return copyDependencies; + } + + public void setCopyDependencies(Boolean copyDependencies) { + this.copyDependencies = copyDependencies; + } + + @Input + @Optional + private Boolean createTarball; + + public Boolean isCreateTarball() { + return createTarball; + } + + public void setCreateTarball(Boolean createTarball) { + this.createTarball = createTarball; + } + + @Input + @Optional + private Boolean createZipball; + + public Boolean isCreateZipball() { + return createZipball; + } + + public void setCreateZipball(Boolean createZipball) { + this.createZipball = createZipball; + } + + @Input + @Optional + private Boolean customizedJre; + + public Boolean isCustomizedJre() { + return customizedJre; + } + + public void setCustomizedJre(Boolean customizedJre) { + this.customizedJre = customizedJre; + } + + @Input + @Optional + private String appDescription; + + public String getAppDescription() { + return appDescription; + } + + public void setAppDescription(String appDescription) { + this.appDescription = appDescription; + } + + @Input + @Optional + private String displayName; + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + @Input + @Optional + private String envPath; + + public String getEnvPath() { + return envPath; + } + + public void setEnvPath(String envPath) { + this.envPath = envPath; + } + + @Input + @Optional + private Map extra; + + public Map getExtra() { + return extra; + } + + public void setExtra(Map extra) { + this.extra = extra; + } + + @Input + @Optional + private Boolean generateInstaller; + + public Boolean isGenerateInstaller() { + return generateInstaller; + } + + public void setGenerateInstaller(Boolean generateInstaller) { + this.generateInstaller = generateInstaller; + } + + @Input + @Optional + private Boolean forceInstaller; + + public Boolean isForceInstaller() { + return forceInstaller; + } + + public void setForceInstaller(Boolean forceInstaller) { + this.forceInstaller = forceInstaller; + } + + @InputDirectory + @Optional + private File jdkPath; + + public File getJdkPath() { + return jdkPath; + } + + public void setJdkPath(File jdkPath) { + this.jdkPath = jdkPath; + } + + @Input + @Optional + private String jreDirectoryName; + + public String getJreDirectoryName() { + return jreDirectoryName; + } + + public void setJreDirectoryName(String jreDirectoryName) { + this.jreDirectoryName = jreDirectoryName; + } + + @InputDirectory + @Optional + private File jrePath; + + public File getJrePath() { + return jrePath; + } + + public void setJrePath(File jrePath) { + this.jrePath = jrePath; + } + + @InputFile + @Optional + private File licenseFile; + + public File getLicenseFile() { + return licenseFile; + } + + public void setLicenseFile(File licenseFile) { + this.licenseFile = licenseFile; + } + + @Input + @Optional + private LinuxConfig linuxConfig; + + public LinuxConfig getLinuxConfig() { + return linuxConfig; + } + + public void setLinuxConfig(LinuxConfig linuxConfig) { + this.linuxConfig = linuxConfig; + } + + public LinuxConfig linuxConfig(Closure closure) { + linuxConfig = new LinuxConfig(); + getProject().configure(linuxConfig, closure); + return linuxConfig; + } + + @Input + @Optional + private MacConfig macConfig; + + public MacConfig getMacConfig() { + return macConfig; + } + + public void setMacConfig(MacConfig macConfig) { + this.macConfig = macConfig; + } + + public MacConfig macConfig(Closure closure) { + macConfig = new MacConfig(); + getProject().configure(macConfig, closure); + return macConfig; + } + + @Input + @Optional + private String mainClass; + + public String getMainClass() { + return mainClass; + } + + public void setMainClass(String mainClass) { + this.mainClass = mainClass; + } + + @Input + @Optional + private List modules; + + public List getModules() { + return modules; + } + + public void setModules(List modules) { + this.modules = modules; + } + + @Input + @Optional + private String appName; + + public String getAppName() { + return appName; + } + + public void setAppName(String appName) { + this.appName = appName; + } + + @Input + @Optional + private String organizationEmail; + + public String getOrganizationEmail() { + return organizationEmail; + } + + public void setOrganizationEmail(String organizationEmail) { + this.organizationEmail = organizationEmail; + } + + @Input + @Optional + private String organizationName; + + public String getOrganizationName() { + return organizationName; + } + + public void setOrganizationName(String organizationName) { + this.organizationName = organizationName; + } + + @Input + @Optional + private String organizationUrl; + + public String getOrganizationUrl() { + return organizationUrl; + } + + public void setOrganizationUrl(String organizationUrl) { + this.organizationUrl = organizationUrl; + } + + @InputFile + @Optional + private File runnableJar; + + public File getRunnableJar() { + return runnableJar; + } + + public void setRunnableJar(File runnableJar) { + this.runnableJar = runnableJar; + } + + @Input + @Optional + private Boolean useResourcesAsWorkingDir; + + public Boolean isUseResourcesAsWorkingDir() { + return useResourcesAsWorkingDir; + } + + public void setUseResourcesAsWorkingDir(Boolean useResourcesAsWorkingDir) { + this.useResourcesAsWorkingDir = useResourcesAsWorkingDir; + } + + @Input + @Optional + private String url; + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + @Input + @Optional + private List vmArgs; + + public List getVmArgs() { + return vmArgs; + } + + public void setVmArgs(List vmArgs) { + this.vmArgs = vmArgs; + } + + @Input + @Optional + private WindowsConfig winConfig; + + public WindowsConfig getWinConfig() { + return winConfig; + } + + public WindowsConfig winConfig(Closure closure) { + winConfig = new WindowsConfig(); + getProject().configure(winConfig, closure); + return winConfig; + } + + @Input + @Optional + private String version; + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + @OutputDirectory + @Optional + private File outputDirectory; + + public File getOutputDirectory() { + return outputDirectory; + } + + public void setOutputDirectory(File outputDirectory) { + this.outputDirectory = outputDirectory; + } + + @Input + @Optional + private String classpath; + + public String getClasspath() { + return classpath; + } + + public void setClasspath(String classpath) { + this.classpath = classpath; + } + + @Input + @Optional + private String jreMinVersion; + + public String getJreMinVersion() { + return jreMinVersion; + } + + public void setJreMinVersion(String jreMinVersion) { + this.jreMinVersion = jreMinVersion; + } + + @Input + @Optional + private Manifest manifest; + + public Manifest getManifest() { + return manifest; + } + + public Manifest manifest(Closure closure) { + manifest = new Manifest(); + getProject().configure(manifest, closure); + return manifest; + } + + @Input + @Optional + private List additionalModulePaths; + + public List getAdditionalModulePaths() { + return additionalModulePaths; + } + + public void setAdditionalModulePaths(List additionalModulePaths) { + this.additionalModulePaths = additionalModulePaths; + } + + @Input + @Optional + private List fileAssociations; + + public List getFileAssociations() { + return fileAssociations; + } + + public void setFileAssociations(List fileAssociations) { + this.fileAssociations = fileAssociations; + } + + @Input + @Optional + private Scripts scripts; + + public Scripts getScripts() { + return scripts; + } + + public void setScripts(Scripts scripts) { + this.scripts = scripts; + } + + public Scripts scripts(Closure closure) { + scripts = new Scripts(); + getProject().configure(scripts, closure); + return scripts; + } + + // =============== + // create packager + // =============== @SuppressWarnings("unchecked") @Override protected Packager createPackager() throws Exception { - return settings.createPackager(); + + PackagePluginExtension extension = getProject().getExtensions().findByType(PackagePluginExtension.class); + + return + (Packager) PackagerFactory + .createPackager(defaultIfNull(platform, extension.getPlatform())) + .additionalModules(defaultIfNull(additionalModules, extension.getAdditionalModules())) + .additionalModulePaths(defaultIfNull(additionalModulePaths, extension.getAdditionalModulePaths())) + .additionalResources(defaultIfNull(additionalResources, extension.getAdditionalResources())) + .administratorRequired(defaultIfNull(administratorRequired, extension.getAdministratorRequired())) + .assetsDir(defaultIfNull(assetsDir, extension.getAssetsDir())) + .bundleJre(defaultIfNull(bundleJre, extension.getBundleJre())) + .classpath(defaultIfNull(classpath, extension.getClasspath())) + .copyDependencies(defaultIfNull(copyDependencies, extension.getCopyDependencies())) + .createTarball(defaultIfNull(createTarball, extension.getCreateTarball())) + .createZipball(defaultIfNull(createZipball, extension.getCreateZipball())) + .customizedJre(defaultIfNull(customizedJre, extension.getCustomizedJre())) + .description(defaultIfNull(appDescription, extension.getDescription())) + .displayName(defaultIfNull(displayName, extension.getDisplayName())) + .envPath(defaultIfNull(envPath, extension.getEnvPath())) + .extra(defaultIfNull(extra, extension.getExtra())) + .fileAssociations(defaultIfNull(fileAssociations, extension.getFileAssociations())) + .forceInstaller(defaultIfNull(forceInstaller, extension.isForceInstaller())) + .generateInstaller(defaultIfNull(generateInstaller, extension.getGenerateInstaller())) + .jdkPath(defaultIfNull(jdkPath, extension.getJdkPath())) + .jreDirectoryName(defaultIfBlank(jreDirectoryName, extension.getJreDirectoryName())) + .jreMinVersion(defaultIfBlank(jreMinVersion, extension.getJreMinVersion())) + .jrePath(defaultIfNull(jrePath, extension.getJrePath())) + .licenseFile(defaultIfNull(licenseFile, extension.getLicenseFile())) + .linuxConfig(defaultIfNull(linuxConfig, extension.getLinuxConfig())) + .macConfig(defaultIfNull(macConfig, extension.getMacConfig())) + .mainClass(defaultIfNull(mainClass, extension.getMainClass())) + .manifest(defaultIfNull(manifest, extension.getManifest())) + .modules(defaultIfNull(modules, extension.getModules())) + .name(defaultIfNull(appName, extension.getName())) + .organizationEmail(defaultIfNull(organizationEmail, extension.getOrganizationEmail())) + .organizationName(defaultIfNull(organizationName, extension.getOrganizationName())) + .organizationUrl(defaultIfNull(organizationUrl, extension.getOrganizationUrl())) + .outputDirectory(defaultIfNull(outputDirectory, extension.getOutputDirectory())) + .packagingJdk(defaultIfNull(packagingJdk, extension.getPackagingJdk(), Context.getGradleContext().getDefaultToolchain())) + .runnableJar(defaultIfNull(runnableJar, extension.getRunnableJar())) + .scripts(defaultIfNull(scripts, extension.getScripts())) + .useResourcesAsWorkingDir(defaultIfNull(useResourcesAsWorkingDir, extension.isUseResourcesAsWorkingDir())) + .url(defaultIfNull(url, extension.getUrl())) + .version(defaultIfNull(version, extension.getVersion(), getProject().getVersion().toString())) + .vmArgs(defaultIfNull(vmArgs, extension.getVmArgs())) + .winConfig(defaultIfNull(winConfig, extension.getWinConfig())); + } - -} + +} \ No newline at end of file diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerSettings.java b/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerSettings.java index 40b3f68c..33deea36 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerSettings.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerSettings.java @@ -15,149 +15,57 @@ import io.github.fvarrui.javapackager.model.Platform; import io.github.fvarrui.javapackager.model.Scripts; import io.github.fvarrui.javapackager.model.WindowsConfig; -import org.gradle.api.tasks.*; /** - * Common packagers' settings, - * supports maven and gradle. + * Common packagers' settings */ public class PackagerSettings { - @OutputDirectory - @Optional protected File outputDirectory; - @InputFile - @Optional protected File licenseFile; - @InputFile - @Optional protected File iconFile; - @Input - @Optional protected Boolean generateInstaller; - @Input - @Optional protected boolean forceInstaller; - @Input - @Optional protected String mainClass; - @Input - @Optional protected String name; - @Input - @Optional protected String displayName; - @Input - @Optional protected String version; - @Input - @Optional protected String description; - @Input - @Optional protected String url; - @Input - @Optional protected Boolean administratorRequired; - @Input - @Optional protected String organizationName; - @Input - @Optional protected String organizationUrl; - @Input - @Optional protected String organizationEmail; - @Input - @Optional protected Boolean bundleJre; - @Input - @Optional protected Boolean customizedJre; - @InputDirectory - @Optional protected File jrePath; - @InputDirectory - @Optional protected File jdkPath; - @Input - @Optional - protected String jdkVersion = "8"; - @Input - @Optional - protected String jdkVendor = "temurin"; - @Input - @Optional protected List additionalResources; - @Input - @Optional protected List modules; - @Input - @Optional protected List additionalModules; - @Input - @Optional protected Platform platform; - @Input - @Optional protected String envPath; - @Input - @Optional protected List vmArgs; - @InputFile - @Optional protected File runnableJar; - @Input - @Optional protected Boolean copyDependencies; - @Input - @Optional protected String jreDirectoryName; - @Input - @Optional protected WindowsConfig winConfig; - @Input - @Optional protected LinuxConfig linuxConfig; - @Input - @Optional protected MacConfig macConfig; - @Input - @Optional protected Boolean createTarball; - @Input - @Optional protected Boolean createZipball; - @Input - @Optional protected Map extra; - @Input - @Optional protected boolean useResourcesAsWorkingDir; - @InputDirectory - @Optional protected File assetsDir; - @Input - @Optional protected String classpath; - @Input - @Optional protected String jreMinVersion; - @Input - @Optional protected Manifest manifest; - @Input - @Optional protected List additionalModulePaths; - @Input - @Optional protected List fileAssociations; - @InputDirectory - @Optional protected File packagingJdk; - @Input - @Optional protected Scripts scripts; + protected String jdkVersion = "8"; + protected String jdkVendor = "adoptium"; /** * Get packaging JDK @@ -176,7 +84,7 @@ public File getOutputDirectory() { } /** - * Get license file + * Get license file * @return License file */ public File getLicenseFile() { @@ -198,7 +106,7 @@ public File getIconFile() { public Boolean getGenerateInstaller() { return generateInstaller; } - + /** * Get force installer * @return Force installer @@ -376,7 +284,7 @@ public File getRunnableJar() { } /** - * Get copy dependencies + * Get copy dependencies * @return Copy dependencies */ public Boolean getCopyDependencies() { @@ -415,7 +323,7 @@ public MacConfig getMacConfig() { return macConfig; } - /** + /** * Get create tarball * @return Create tarball */ @@ -554,7 +462,7 @@ public PackagerSettings generateInstaller(Boolean generateInstaller) { this.generateInstaller = generateInstaller; return this; } - + /** * Set force installer * @param forceInstaller Force installer @@ -973,4 +881,4 @@ public String toString() { + ", classpath=" + classpath + ", jreMinVersion=" + jreMinVersion + ", manifest=" + manifest + ", additionalModulePaths=" + additionalModulePaths + ", fileAssociations=" + fileAssociations + ", packagingJdk=" + packagingJdk + ", scripts=" + scripts + "]"; - }} + }} \ No newline at end of file diff --git a/src/main/java/io/github/fvarrui/javapackager/utils/DownloadUtils.java b/src/main/java/io/github/fvarrui/javapackager/utils/DownloadUtils.java deleted file mode 100644 index d2344e57..00000000 --- a/src/main/java/io/github/fvarrui/javapackager/utils/DownloadUtils.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.github.fvarrui.javapackager.utils; - -public class DownloadUtils { - -} diff --git a/src/main/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdater.java b/src/main/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdater.java index 2573cb05..1bafbdab 100644 --- a/src/main/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdater.java +++ b/src/main/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdater.java @@ -57,7 +57,7 @@ public TaskJavaUpdater(Platform platform) { public void execute(String javaVersion, String javaVendor) throws Exception { Objects.requireNonNull(javaVersion); Objects.requireNonNull(javaVendor); - if(!javaVendor.equals("temurin")) throw new IllegalArgumentException("The provided Java vendor '"+javaVendor+"' is currently not supported!"); + if(!javaVendor.equals("adoptium")) throw new IllegalArgumentException("The provided Java vendor '"+javaVendor+"' is currently not supported!"); Logger.info("Checking java installation..."); AdoptV3API.OperatingSystemArchitectureType osArchitectureType = AdoptV3API.OperatingSystemArchitectureType.X64; boolean isLargeHeapSize = false; From b5057d0441c0c4b4a559b6ae8491a69bc97ac51e Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Tue, 2 Aug 2022 14:03:49 +0200 Subject: [PATCH 20/74] added new settings --- .../gradle/DefaultPackageTask.java | 2 + .../javapackager/gradle/PackageTask.java | 26 ++++++++++++ .../javapackager/maven/PackageMojo.java | 14 +++++++ .../packagers/PackagerSettings.java | 40 ++++++++++++++++++- 4 files changed, 80 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/DefaultPackageTask.java b/src/main/java/io/github/fvarrui/javapackager/gradle/DefaultPackageTask.java index 34a7b434..b4195a35 100644 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/DefaultPackageTask.java +++ b/src/main/java/io/github/fvarrui/javapackager/gradle/DefaultPackageTask.java @@ -37,6 +37,8 @@ protected Packager createPackager() throws Exception { .forceInstaller(extension.isForceInstaller()) .generateInstaller(extension.getGenerateInstaller()) .jdkPath(extension.getJdkPath()) + .jdkVersion(extension.getJdkVersion()) + .jdkVendor(extension.getJdkVendor()) .jreDirectoryName(extension.getJreDirectoryName()) .jreMinVersion(extension.getJreMinVersion()) .jrePath(extension.getJrePath()) diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/PackageTask.java b/src/main/java/io/github/fvarrui/javapackager/gradle/PackageTask.java index 217b4221..124158a1 100644 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/PackageTask.java +++ b/src/main/java/io/github/fvarrui/javapackager/gradle/PackageTask.java @@ -250,6 +250,30 @@ public void setJdkPath(File jdkPath) { this.jdkPath = jdkPath; } + @InputDirectory + @Optional + private String jdkVersion; + + public String getJdkVersion() { + return jdkVersion; + } + + public void setJdkVersion(String jdkVersion) { + this.jdkVersion = jdkVersion; + } + + @InputDirectory + @Optional + private String jdkVendor; + + public String getJdkVendor() { + return jdkVendor; + } + + public void setJdkPath(String jdkVendor) { + this.jdkVendor = jdkVendor; + } + @Input @Optional private String jreDirectoryName; @@ -592,6 +616,8 @@ protected Packager createPackager() throws Exception { .forceInstaller(defaultIfNull(forceInstaller, extension.isForceInstaller())) .generateInstaller(defaultIfNull(generateInstaller, extension.getGenerateInstaller())) .jdkPath(defaultIfNull(jdkPath, extension.getJdkPath())) + .jdkVersion(defaultIfNull(jdkVersion, extension.getJdkVersion())) + .jdkVendor(defaultIfNull(jdkVendor, extension.getJdkVendor())) .jreDirectoryName(defaultIfBlank(jreDirectoryName, extension.getJreDirectoryName())) .jreMinVersion(defaultIfBlank(jreMinVersion, extension.getJreMinVersion())) .jrePath(defaultIfNull(jrePath, extension.getJrePath())) diff --git a/src/main/java/io/github/fvarrui/javapackager/maven/PackageMojo.java b/src/main/java/io/github/fvarrui/javapackager/maven/PackageMojo.java index ab46e81e..f41f5d45 100644 --- a/src/main/java/io/github/fvarrui/javapackager/maven/PackageMojo.java +++ b/src/main/java/io/github/fvarrui/javapackager/maven/PackageMojo.java @@ -162,6 +162,18 @@ public class PackageMojo extends AbstractMojo { @Parameter(property = "jdkPath", required = false) private File jdkPath; + /** + * The JDK version. Supported versions differ from vendor to vendor, thus its recommended checking the vendors' website first before doing any changes. + */ + @Parameter(property = "jdkVersion", required = false) + private String jdkVersion; + + /** + * The JDK vendor. + */ + @Parameter(property = "jdkVendor", required = false) + private String jdkVendor; + /** * Additional files and folders to include in the bundled app. */ @@ -349,6 +361,8 @@ public void execute() throws MojoExecutionException { .generateInstaller(generateInstaller) .iconFile(iconFile) .jdkPath(jdkPath) + .jdkVersion(jdkVersion) + .jdkVendor(jdkVendor) .jreDirectoryName(jreDirectoryName) .jreMinVersion(jreMinVersion) .jrePath(jrePath) diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerSettings.java b/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerSettings.java index 33deea36..ae2c272b 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerSettings.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerSettings.java @@ -40,6 +40,8 @@ public class PackagerSettings { protected Boolean customizedJre; protected File jrePath; protected File jdkPath; + protected String jdkVersion = "8"; + protected String jdkVendor = "adoptium"; protected List additionalResources; protected List modules; protected List additionalModules; @@ -64,8 +66,6 @@ public class PackagerSettings { protected List fileAssociations; protected File packagingJdk; protected Scripts scripts; - protected String jdkVersion = "8"; - protected String jdkVendor = "adoptium"; /** * Get packaging JDK @@ -227,6 +227,22 @@ public File getJdkPath() { return jdkPath; } + /** + * Get JDK version + * @return JDK version + */ + public String getJdkVersion() { + return jdkVersion; + } + + /** + * Get JDK vendor + * @return JDK vendor + */ + public String getJdkVendor() { + return jdkVendor; + } + /** * Get additional resourcxes * @return Additional resources @@ -613,6 +629,26 @@ public PackagerSettings jdkPath(File jdkPath) { return this; } + /** + * Set JDK version + * @param jdkVersion JDK version + * @return Packager settings + */ + public PackagerSettings jdkVersion(String jdkVersion) { + this.jdkVersion = jdkVersion; + return this; + } + + /** + * Set JDK vendor + * @param jdkVendor JDK vendor + * @return Packager settings + */ + public PackagerSettings jdkVendor(String jdkVendor) { + this.jdkVendor = jdkVendor; + return this; + } + /** * Set additional resources list * @param additionalResources Additional resources list From 644b44ca34eba0ddbbb70a9810f2752fc38340bd Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Tue, 2 Aug 2022 15:07:50 +0200 Subject: [PATCH 21/74] moved defaults to right place --- .../io/github/fvarrui/javapackager/maven/PackageMojo.java | 4 ++-- .../fvarrui/javapackager/packagers/PackagerSettings.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/github/fvarrui/javapackager/maven/PackageMojo.java b/src/main/java/io/github/fvarrui/javapackager/maven/PackageMojo.java index f41f5d45..8f452dd1 100644 --- a/src/main/java/io/github/fvarrui/javapackager/maven/PackageMojo.java +++ b/src/main/java/io/github/fvarrui/javapackager/maven/PackageMojo.java @@ -165,13 +165,13 @@ public class PackageMojo extends AbstractMojo { /** * The JDK version. Supported versions differ from vendor to vendor, thus its recommended checking the vendors' website first before doing any changes. */ - @Parameter(property = "jdkVersion", required = false) + @Parameter(defaultValue = "8", property = "jdkVersion", required = false) private String jdkVersion; /** * The JDK vendor. */ - @Parameter(property = "jdkVendor", required = false) + @Parameter(defaultValue = "adoptium", property = "jdkVendor", required = false) private String jdkVendor; /** diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerSettings.java b/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerSettings.java index ae2c272b..a0142795 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerSettings.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerSettings.java @@ -40,8 +40,8 @@ public class PackagerSettings { protected Boolean customizedJre; protected File jrePath; protected File jdkPath; - protected String jdkVersion = "8"; - protected String jdkVendor = "adoptium"; + protected String jdkVersion; + protected String jdkVendor; protected List additionalResources; protected List modules; protected List additionalModules; From a1a42c98a8ac7db89f59d9e7343b056dfdf6bfbf Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Wed, 3 Aug 2022 12:52:57 +0200 Subject: [PATCH 22/74] added test and fix jdk path --- build.gradle | 6 +++++- .../utils/updater/TaskJavaUpdater.java | 13 +++++++++++++ .../utils/updater/TaskJavaUpdaterTest.java | 17 +++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 src/test/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdaterTest.java diff --git a/build.gradle b/build.gradle index 7cc61844..3f45dde4 100644 --- a/build.gradle +++ b/build.gradle @@ -59,7 +59,7 @@ dependencies { implementation 'com.squareup.okhttp3:okhttp:4.10.0' implementation 'org.rauschig:jarchivelib:1.2.0' - testImplementation 'junit:junit:4.12' + testImplementation 'org.junit.jupiter:junit-jupiter:5.8.2' compileOnly 'org.apache.maven.plugin-tools:maven-plugin-annotations:3.6.0' @@ -72,6 +72,10 @@ dependencies { mavenEmbedder 'org.apache.maven.wagon:wagon-provider-api:3.4.1' } +test { + useJUnitPlatform() +} + group = 'io.github.fvarrui' version = '1.6.7' description = 'Hybrid Maven/Gradle plugin to package Java applications as native Windows, Mac OS X or GNU/Linux executables and create installers for them' diff --git a/src/main/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdater.java b/src/main/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdater.java index 1bafbdab..8652fff2 100644 --- a/src/main/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdater.java +++ b/src/main/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdater.java @@ -8,6 +8,7 @@ package io.github.fvarrui.javapackager.utils.updater; +import com.google.common.io.Files; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @@ -146,8 +147,20 @@ public void execute(String javaVersion, String javaVendor) throws Exception { else // A zip archiver = ArchiverFactory.createArchiver(ArchiveFormat.ZIP); + // Extracts to /jdk8+189 thus we need to move its content to its parent dir archiver.extract(download.getNewCacheDest(), final_dir_dest); setBuildID(latestBuildId); + File actualJdkPath = null; + for (File file : jdkPath.listFiles()) { + if(file.isDirectory()){ + actualJdkPath = file; + break; + } + } + for (File file : actualJdkPath.listFiles()) { + Files.move(file, new File(jdkPath+"/"+file.getName())); + } + FileUtils.deleteDirectory(actualJdkPath); FileUtils.deleteDirectory(downloadsDir); Logger.info("Java update was installed successfully (" + currentBuildId + " -> " + latestBuildId + ") at "+jdkPath); } diff --git a/src/test/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdaterTest.java b/src/test/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdaterTest.java new file mode 100644 index 00000000..5d9de2a4 --- /dev/null +++ b/src/test/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdaterTest.java @@ -0,0 +1,17 @@ +package io.github.fvarrui.javapackager.utils.updater; + +import io.github.fvarrui.javapackager.model.Platform; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class TaskJavaUpdaterTest { + @Test + void execute() throws Exception { + TaskJavaUpdater taskJavaUpdater = new TaskJavaUpdater(Platform.getCurrentPlatform()); + taskJavaUpdater.execute("8", "adoptium"); + assertNotNull(taskJavaUpdater.jdkPath); + assertTrue(taskJavaUpdater.jdkPath.listFiles().length != 0); + System.out.println(taskJavaUpdater.jdkPath); + } +} \ No newline at end of file From 49ef8de72dc04762f5b599c0016f6f815b87ecf3 Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Wed, 3 Aug 2022 13:58:12 +0200 Subject: [PATCH 23/74] added all platform tests --- .../utils/updater/TaskJavaUpdaterTest.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/test/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdaterTest.java b/src/test/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdaterTest.java index 5d9de2a4..8ce76f14 100644 --- a/src/test/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdaterTest.java +++ b/src/test/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdaterTest.java @@ -7,8 +7,24 @@ class TaskJavaUpdaterTest { @Test - void execute() throws Exception { - TaskJavaUpdater taskJavaUpdater = new TaskJavaUpdater(Platform.getCurrentPlatform()); + void testWindows() throws Exception { + TaskJavaUpdater taskJavaUpdater = new TaskJavaUpdater(Platform.windows); + taskJavaUpdater.execute("8", "adoptium"); + assertNotNull(taskJavaUpdater.jdkPath); + assertTrue(taskJavaUpdater.jdkPath.listFiles().length != 0); + System.out.println(taskJavaUpdater.jdkPath); + } + @Test + void testLinux() throws Exception { + TaskJavaUpdater taskJavaUpdater = new TaskJavaUpdater(Platform.linux); + taskJavaUpdater.execute("8", "adoptium"); + assertNotNull(taskJavaUpdater.jdkPath); + assertTrue(taskJavaUpdater.jdkPath.listFiles().length != 0); + System.out.println(taskJavaUpdater.jdkPath); + } + @Test + void testMac() throws Exception { + TaskJavaUpdater taskJavaUpdater = new TaskJavaUpdater(Platform.mac); taskJavaUpdater.execute("8", "adoptium"); assertNotNull(taskJavaUpdater.jdkPath); assertTrue(taskJavaUpdater.jdkPath.listFiles().length != 0); From b579ce854588bbc1fa3a6d04c3c2d8c7a2df86fa Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Wed, 3 Aug 2022 18:35:38 +0200 Subject: [PATCH 24/74] implemented gradle and maven hello world projects into test --- build.gradle | 10 + .../javapackager/ideas/MyGradleTask.java | 11 + .../javapackager/ideas/MyMavenTask.java | 4 + .../javapackager/ideas/MySettings.java | 14 + .../javapackager/utils/updater/Json.java | 2 +- .../javapackager/utils/updater/RealTest.java | 66 ++ test/hello-world-gradle/.gitattributes | 2 + test/hello-world-gradle/.gitignore | 8 + test/hello-world-gradle/.vscode/settings.json | 0 test/hello-world-gradle/LICENSE | 674 ++++++++++++++++++ test/hello-world-gradle/README.md | 3 + .../addons/commons-test-1.2.3.jar | Bin 0 -> 284220 bytes test/hello-world-gradle/assets/bootstrap.sh | 2 + .../assets/linux/HelloWorldGradle.png | Bin 0 -> 17690 bytes .../assets/mac/HelloWorldGradle.icns | Bin 0 -> 104590 bytes .../assets/windows/HelloWorldGradle.ico | Bin 0 -> 209948 bytes .../assets/windows/script.bat | 4 + test/hello-world-gradle/build.gradle | 98 +++ .../gradle/wrapper/gradle-wrapper.jar | 0 .../gradle/wrapper/gradle-wrapper.properties | 0 test/hello-world-gradle/gradlew | 188 +++++ test/hello-world-gradle/gradlew.bat | 100 +++ test/hello-world-gradle/info.txt | 1 + .../plugins/commons-lang-2.6.jar | Bin 0 -> 284220 bytes test/hello-world-gradle/settings.gradle | 9 + .../fvarrui/helloworld/HelloWorldFrame.java | 117 +++ .../io/github/fvarrui/helloworld/Main.java | 13 + .../src/main/resources/images/world.png | Bin 0 -> 17690 bytes .../src/main/resources/info.txt | 1 + test/hello-world-maven/.circleci/config.yml | 0 test/hello-world-maven/.gitattributes | 2 + .../.github/workflows/package.yml | 24 + test/hello-world-maven/.gitignore | 5 + test/hello-world-maven/CustomMessages_en.isl | 2 + test/hello-world-maven/CustomMessages_es.isl | 2 + test/hello-world-maven/LICENSE | 674 ++++++++++++++++++ test/hello-world-maven/README.md | 3 + .../assets/HelloWorldMaven.icns | Bin 0 -> 71373 bytes .../assets/HelloWorldMaven.ico | Bin 0 -> 432254 bytes .../assets/HelloWorldMaven.png | Bin 0 -> 10255 bytes .../assets/linux/HelloWorldMaven.png | Bin 0 -> 17690 bytes .../assets/mac/HelloWorldMaven.icns | Bin 0 -> 104590 bytes .../assets/windows/HelloWorldMaven.ico | Bin 0 -> 209948 bytes test/hello-world-maven/info.txt | 1 + test/hello-world-maven/pom.xml | 105 +++ .../fvarrui/helloworld/HelloWorldFrame.java | 115 +++ .../io/github/fvarrui/helloworld/Main.java | 38 + .../src/main/resources/images/world.png | Bin 0 -> 17690 bytes .../src/main/resources/info.txt | 1 + 49 files changed, 2298 insertions(+), 1 deletion(-) create mode 100644 src/main/java/io/github/fvarrui/javapackager/ideas/MyGradleTask.java create mode 100644 src/main/java/io/github/fvarrui/javapackager/ideas/MyMavenTask.java create mode 100644 src/main/java/io/github/fvarrui/javapackager/ideas/MySettings.java create mode 100644 src/test/java/io/github/fvarrui/javapackager/utils/updater/RealTest.java create mode 100644 test/hello-world-gradle/.gitattributes create mode 100644 test/hello-world-gradle/.gitignore create mode 100644 test/hello-world-gradle/.vscode/settings.json create mode 100644 test/hello-world-gradle/LICENSE create mode 100644 test/hello-world-gradle/README.md create mode 100644 test/hello-world-gradle/addons/commons-test-1.2.3.jar create mode 100644 test/hello-world-gradle/assets/bootstrap.sh create mode 100644 test/hello-world-gradle/assets/linux/HelloWorldGradle.png create mode 100644 test/hello-world-gradle/assets/mac/HelloWorldGradle.icns create mode 100644 test/hello-world-gradle/assets/windows/HelloWorldGradle.ico create mode 100644 test/hello-world-gradle/assets/windows/script.bat create mode 100644 test/hello-world-gradle/build.gradle create mode 100644 test/hello-world-gradle/gradle/wrapper/gradle-wrapper.jar create mode 100644 test/hello-world-gradle/gradle/wrapper/gradle-wrapper.properties create mode 100644 test/hello-world-gradle/gradlew create mode 100644 test/hello-world-gradle/gradlew.bat create mode 100644 test/hello-world-gradle/info.txt create mode 100644 test/hello-world-gradle/plugins/commons-lang-2.6.jar create mode 100644 test/hello-world-gradle/settings.gradle create mode 100644 test/hello-world-gradle/src/main/java/io/github/fvarrui/helloworld/HelloWorldFrame.java create mode 100644 test/hello-world-gradle/src/main/java/io/github/fvarrui/helloworld/Main.java create mode 100644 test/hello-world-gradle/src/main/resources/images/world.png create mode 100644 test/hello-world-gradle/src/main/resources/info.txt create mode 100644 test/hello-world-maven/.circleci/config.yml create mode 100644 test/hello-world-maven/.gitattributes create mode 100644 test/hello-world-maven/.github/workflows/package.yml create mode 100644 test/hello-world-maven/.gitignore create mode 100644 test/hello-world-maven/CustomMessages_en.isl create mode 100644 test/hello-world-maven/CustomMessages_es.isl create mode 100644 test/hello-world-maven/LICENSE create mode 100644 test/hello-world-maven/README.md create mode 100644 test/hello-world-maven/assets/HelloWorldMaven.icns create mode 100644 test/hello-world-maven/assets/HelloWorldMaven.ico create mode 100644 test/hello-world-maven/assets/HelloWorldMaven.png create mode 100644 test/hello-world-maven/assets/linux/HelloWorldMaven.png create mode 100644 test/hello-world-maven/assets/mac/HelloWorldMaven.icns create mode 100644 test/hello-world-maven/assets/windows/HelloWorldMaven.ico create mode 100644 test/hello-world-maven/info.txt create mode 100644 test/hello-world-maven/pom.xml create mode 100644 test/hello-world-maven/src/main/java/io/github/fvarrui/helloworld/HelloWorldFrame.java create mode 100644 test/hello-world-maven/src/main/java/io/github/fvarrui/helloworld/Main.java create mode 100644 test/hello-world-maven/src/main/resources/images/world.png create mode 100644 test/hello-world-maven/src/main/resources/info.txt diff --git a/build.gradle b/build.gradle index 3f45dde4..e39dab5e 100644 --- a/build.gradle +++ b/build.gradle @@ -15,6 +15,7 @@ repositories { maven { url 'https://plugins.gradle.org/m2/' } + maven { url 'https://jitpack.io' } } gradlePlugin { @@ -42,6 +43,13 @@ configurations { mavenEmbedder } +configurations { + // Makes sure that the right dependency gets taken. Author: https://stackoverflow.com/questions/31698510/can-i-force-the-order-of-dependencies-in-my-classpath-with-gradle + priority + sourceSets.main.compileClasspath = configurations.priority + sourceSets.main.compileClasspath +} + + dependencies { implementation 'org.apache.maven:maven-plugin-api:3.6.0' implementation 'org.codehaus.plexus:plexus-utils:3.1.1' @@ -58,8 +66,10 @@ dependencies { implementation 'com.google.code.gson:gson:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.10.0' implementation 'org.rauschig:jarchivelib:1.2.0' + priority 'com.github.Osiris-Team:maven-plugin-tools:1.0.1' testImplementation 'org.junit.jupiter:junit-jupiter:5.8.2' + testImplementation 'org.apache.maven.shared:maven-invoker:3.2.0' compileOnly 'org.apache.maven.plugin-tools:maven-plugin-annotations:3.6.0' diff --git a/src/main/java/io/github/fvarrui/javapackager/ideas/MyGradleTask.java b/src/main/java/io/github/fvarrui/javapackager/ideas/MyGradleTask.java new file mode 100644 index 00000000..483e6e65 --- /dev/null +++ b/src/main/java/io/github/fvarrui/javapackager/ideas/MyGradleTask.java @@ -0,0 +1,11 @@ +package io.github.fvarrui.javapackager.ideas; + +import io.github.fvarrui.javapackager.gradle.AbstractPackageTask; +import io.github.fvarrui.javapackager.packagers.Packager; + +public class MyGradleTask extends AbstractPackageTask implements MySettings{ + @Override + protected Packager createPackager() throws Exception { + return null; + } +} diff --git a/src/main/java/io/github/fvarrui/javapackager/ideas/MyMavenTask.java b/src/main/java/io/github/fvarrui/javapackager/ideas/MyMavenTask.java new file mode 100644 index 00000000..ed223087 --- /dev/null +++ b/src/main/java/io/github/fvarrui/javapackager/ideas/MyMavenTask.java @@ -0,0 +1,4 @@ +package io.github.fvarrui.javapackager.ideas; + +public class MyMavenTask implements MySettings{ +} diff --git a/src/main/java/io/github/fvarrui/javapackager/ideas/MySettings.java b/src/main/java/io/github/fvarrui/javapackager/ideas/MySettings.java new file mode 100644 index 00000000..eed44992 --- /dev/null +++ b/src/main/java/io/github/fvarrui/javapackager/ideas/MySettings.java @@ -0,0 +1,14 @@ +package io.github.fvarrui.javapackager.ideas; + +import org.apache.maven.plugins.annotations.Parameter; +import org.gradle.api.tasks.Input; +import org.gradle.api.tasks.Optional; + +public interface MySettings { + boolean IS_GRADLE = false; + + @Parameter(defaultValue = "${project.name}", property = "name", required = false) + @Input + @Optional + default String getName(){ return (IS_GRADLE ? "default-gradle-name" : "${project.name}");} +} diff --git a/src/main/java/io/github/fvarrui/javapackager/utils/updater/Json.java b/src/main/java/io/github/fvarrui/javapackager/utils/updater/Json.java index 88fcce46..21c9220c 100644 --- a/src/main/java/io/github/fvarrui/javapackager/utils/updater/Json.java +++ b/src/main/java/io/github/fvarrui/javapackager/utils/updater/Json.java @@ -30,7 +30,7 @@ public static String toString(JsonElement el){ * * @param url The url which leads to the json file. * @return JsonElement - * @throws Exception When status code other than 200. + * @throws IOException When status code other than 200. */ public static JsonElement fromUrl(String url) throws IOException { HttpURLConnection con = null; diff --git a/src/test/java/io/github/fvarrui/javapackager/utils/updater/RealTest.java b/src/test/java/io/github/fvarrui/javapackager/utils/updater/RealTest.java new file mode 100644 index 00000000..8cd7abf2 --- /dev/null +++ b/src/test/java/io/github/fvarrui/javapackager/utils/updater/RealTest.java @@ -0,0 +1,66 @@ +package io.github.fvarrui.javapackager.utils.updater; + +import io.github.fvarrui.javapackager.model.Platform; +import org.apache.maven.shared.invoker.DefaultInvocationRequest; +import org.apache.maven.shared.invoker.DefaultInvoker; +import org.apache.maven.shared.invoker.InvocationRequest; +import org.apache.maven.shared.invoker.Invoker; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.io.IOException; +import java.util.Arrays; +import java.util.Map; + +public class RealTest { + @Test + void test() throws Exception { + + // PUBLISH CURRENT JAVA PACKAGER TO LOCAL MAVEN REPO TO BE USED BY THE HELLO WORLD PROJECTS + File gradlew = new File(System.getProperty("user.dir") + + "/gradlew" + (Platform.getCurrentPlatform() == Platform.windows ? ".bat" : ".sh")); + if (getBuilder(gradlew.getAbsolutePath(), "build", "publishToMavenLocal", "-x", "test", "-x", "javadoc") + .start().waitFor() + != 0) throw new Exception("Failed! Exit code is not 0, see details further below:"); + + // PACKAGE GRADLE HELLO WORLD WITH CURRENT JAVA PACKAGER + if (getBuilder(gradlew.getAbsolutePath(), + "clean", "package", "-x", "test", "-x", "javadoc", "--stacktrace") + .directory(new File(System.getProperty("user.dir") + "/test/hello-world-gradle")) + .inheritIO().start().waitFor() + != 0) throw new Exception("Failed! Exit code is not 0, see details further below:"); + + // PACKAGE MAVEN HELLO WORLD WITH CURRENT JAVA PACKAGER + InvocationRequest request = new DefaultInvocationRequest(); + request.setPomFile(new File(System.getProperty("user.dir") + "/test/hello-world-maven/pom.xml")); + request.setGoals(Arrays.asList("clean", "package", "-Dmaven.javadoc.skip=true", "-Dmaven.test.skip=true")); + Invoker invoker = new DefaultInvoker(); + invoker.execute(request); + } + + private ProcessBuilder getBuilder(String... arguments) throws IOException { + ProcessBuilder builder = new ProcessBuilder().command(arguments) + .inheritIO(); + Map environment = builder.environment(); + setValueIgnoreCase(environment, "JAVA_HOME", System.getProperty("java.home")); + return builder; + } + + private String getValueIgnoreCase(Map map, String key) { + for (String _key : map.keySet()) { + if (_key != null && _key.equalsIgnoreCase(key)) + return map.get(_key); + } + return null; + } + + private void setValueIgnoreCase(Map map, String key, String value) { + for (String _key : map.keySet()) { + if (_key != null && _key.equalsIgnoreCase(key)) { + map.put(_key, value); + return; + } + } + } + +} diff --git a/test/hello-world-gradle/.gitattributes b/test/hello-world-gradle/.gitattributes new file mode 100644 index 00000000..dfe07704 --- /dev/null +++ b/test/hello-world-gradle/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/test/hello-world-gradle/.gitignore b/test/hello-world-gradle/.gitignore new file mode 100644 index 00000000..528763a4 --- /dev/null +++ b/test/hello-world-gradle/.gitignore @@ -0,0 +1,8 @@ +.gradle +**/build/ + +bin +target + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar \ No newline at end of file diff --git a/test/hello-world-gradle/.vscode/settings.json b/test/hello-world-gradle/.vscode/settings.json new file mode 100644 index 00000000..e69de29b diff --git a/test/hello-world-gradle/LICENSE b/test/hello-world-gradle/LICENSE new file mode 100644 index 00000000..e62ec04c --- /dev/null +++ b/test/hello-world-gradle/LICENSE @@ -0,0 +1,674 @@ +GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/test/hello-world-gradle/README.md b/test/hello-world-gradle/README.md new file mode 100644 index 00000000..0013138f --- /dev/null +++ b/test/hello-world-gradle/README.md @@ -0,0 +1,3 @@ +# HelloWorld + +JavaPackager sample project. \ No newline at end of file diff --git a/test/hello-world-gradle/addons/commons-test-1.2.3.jar b/test/hello-world-gradle/addons/commons-test-1.2.3.jar new file mode 100644 index 0000000000000000000000000000000000000000..98467d3a653ebad776ffa3542efeb9732fe0b482 GIT binary patch literal 284220 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

|Yf_WZ!duczzo?tV8>Pnk?`BL^_(g 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%0DSh2+l;L|*$wF?P7}7wSeE*} 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%0D!QKQ7cZk<^|KedbHop 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

faTD#cVqP`Bc$9F_6Qk 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 V7&w7~N(TO&0!w$O34wS8^?!3sleYi> literal 0 HcmV?d00001 diff --git a/test/hello-world-gradle/assets/bootstrap.sh b/test/hello-world-gradle/assets/bootstrap.sh new file mode 100644 index 00000000..0658ed83 --- /dev/null +++ b/test/hello-world-gradle/assets/bootstrap.sh @@ -0,0 +1,2 @@ +#!/bin/bash +echo "$(date +"%Y-%m-%d %H:%M:%S") Running bootstrap script" >> $HOME/log.txt \ No newline at end of file diff --git a/test/hello-world-gradle/assets/linux/HelloWorldGradle.png b/test/hello-world-gradle/assets/linux/HelloWorldGradle.png new file mode 100644 index 0000000000000000000000000000000000000000..4ecb0f2de41b4f8291e0de549a66d7a9500c8db2 GIT binary patch literal 17690 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 Z{|`GTkx~_&7cl?;002ovPDHLkV1nZe215V< literal 0 HcmV?d00001 diff --git a/test/hello-world-gradle/assets/mac/HelloWorldGradle.icns b/test/hello-world-gradle/assets/mac/HelloWorldGradle.icns new file mode 100644 index 0000000000000000000000000000000000000000..c70ef7793a1632a83cabee5c3d14b9665baad743 GIT binary patch literal 104590 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 Gf&UFEnO58Y literal 0 HcmV?d00001 diff --git a/test/hello-world-gradle/assets/windows/HelloWorldGradle.ico b/test/hello-world-gradle/assets/windows/HelloWorldGradle.ico new file mode 100644 index 0000000000000000000000000000000000000000..12a838fcb2ec99d4f4fc105928d9ec09e01fa348 GIT binary patch literal 209948 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 &&-)K=bV{& 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 %USERPROFILE%\log.txt \ No newline at end of file diff --git a/test/hello-world-gradle/build.gradle b/test/hello-world-gradle/build.gradle new file mode 100644 index 00000000..4640f6bb --- /dev/null +++ b/test/hello-world-gradle/build.gradle @@ -0,0 +1,98 @@ +buildscript { + repositories { + mavenLocal() + mavenCentral() + } + dependencies { + classpath 'io.github.fvarrui:javapackager:latest.release' + } +} + +plugins { + id 'java' + id 'maven-publish' + id 'com.github.ben-manes.versions' version '0.42.0' +} + +apply plugin: 'io.github.fvarrui.javapackager.plugin' + +dependencies { + implementation 'commons-io:commons-io:2.6' +} + +import io.github.fvarrui.javapackager.gradle.PackageTask; +import io.github.fvarrui.javapackager.model.*; + +group = 'io.github.fvarrui' +version = '1.0.0' +description = 'HelloWorld for Gradle' +sourceCompatibility = '1.8' +compileJava.options.encoding = 'UTF-8' + +javapackager { + mainClass = 'io.github.fvarrui.helloworld.Main' + additionalResources = [ file('src/main/resources/info.txt') ] + bundleJre = true + generateInstaller = true + vmArgs = ["-Djava.library.path=."] + administratorRequired = false +} + +task packageForWindows(type: PackageTask, dependsOn: build) { + description = 'Packages the application as a native Windows executable and bundles it in a zipball' + platform = 'windows' + winConfig { + exeCreationTool = 'winrun4j' + vmArgs = ["-Dprism.maxvram=512m -XX:+UseG1GC"] + generateSetup = false + generateMsi = false + registry = new Registry([ + entries: [ + new RegistryEntry([ + key: "HKCU:MyGradleApp", + valueName: "greeting", + valueType: ValueType.REG_SZ, + valueData: "hello" + ]) + ] + ]) + icoFile = file("windows/HelloWorldGradle.ico") + setupMode = SetupMode.askTheUser + removeOldLibs = true + disableDirPage = false + disableFinishedPage = false + disableWelcomePage = false + createDesktopIconTask = false + } +} + +task packageForLinux(type: PackageTask, dependsOn: build) { + description = 'Packages the application as a native GNU/Linux executable and bundles it in a tarball' + platform = 'linux' + bundleJre = true + createTarball = true + scripts { + bootstrap = file('assets/bootstrap.sh') + } +} + +task packageForMac(type: PackageTask, dependsOn: build) { + description = 'Packages the application as a native Mac OS app and bundles it in a tarball' + platform = 'mac' + createTarball = true + scripts { + bootstrap = file('assets/bootstrap.sh') + } + macConfig { + infoPlist.additionalEntries = ''' + LSUIElement + + ''' + } +} + +task packageForAllPlatforms(dependsOn: [ packageForWindows, packageForMac, packageForLinux ]) { + description = 'Packages the application for all platforms' + group = 'JavaPackager' +} + diff --git a/test/hello-world-gradle/gradle/wrapper/gradle-wrapper.jar b/test/hello-world-gradle/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 00000000..e69de29b diff --git a/test/hello-world-gradle/gradle/wrapper/gradle-wrapper.properties b/test/hello-world-gradle/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..e69de29b diff --git a/test/hello-world-gradle/gradlew b/test/hello-world-gradle/gradlew new file mode 100644 index 00000000..b0d6d0ab --- /dev/null +++ b/test/hello-world-gradle/gradlew @@ -0,0 +1,188 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/test/hello-world-gradle/gradlew.bat b/test/hello-world-gradle/gradlew.bat new file mode 100644 index 00000000..9991c503 --- /dev/null +++ b/test/hello-world-gradle/gradlew.bat @@ -0,0 +1,100 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem http://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/test/hello-world-gradle/info.txt b/test/hello-world-gradle/info.txt new file mode 100644 index 00000000..9673394d --- /dev/null +++ b/test/hello-world-gradle/info.txt @@ -0,0 +1 @@ +Soy otro fichero! Hahaha \ No newline at end of file diff --git a/test/hello-world-gradle/plugins/commons-lang-2.6.jar b/test/hello-world-gradle/plugins/commons-lang-2.6.jar new file mode 100644 index 0000000000000000000000000000000000000000..98467d3a653ebad776ffa3542efeb9732fe0b482 GIT binary patch literal 284220 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

|Yf_WZ!duczzo?tV8>Pnk?`BL^_(g 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%0DSh2+l;L|*$wF?P7}7wSeE*} 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%0D!QKQ7cZk<^|KedbHop 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

faTD#cVqP`Bc$9F_6Qk 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 V7&w7~N(TO&0!w$O34wS8^?!3sleYi> literal 0 HcmV?d00001 diff --git a/test/hello-world-gradle/settings.gradle b/test/hello-world-gradle/settings.gradle new file mode 100644 index 00000000..180b9335 --- /dev/null +++ b/test/hello-world-gradle/settings.gradle @@ -0,0 +1,9 @@ +pluginManagement { + repositories { + mavenLocal() + mavenCentral() + gradlePluginPortal() + } +} + +rootProject.name = 'HelloWorldGradle' diff --git a/test/hello-world-gradle/src/main/java/io/github/fvarrui/helloworld/HelloWorldFrame.java b/test/hello-world-gradle/src/main/java/io/github/fvarrui/helloworld/HelloWorldFrame.java new file mode 100644 index 00000000..eff10d56 --- /dev/null +++ b/test/hello-world-gradle/src/main/java/io/github/fvarrui/helloworld/HelloWorldFrame.java @@ -0,0 +1,117 @@ +package io.github.fvarrui.helloworld; + +import java.awt.BorderLayout; +//import java.awt.Desktop; +import java.awt.Font; +//import java.awt.desktop.OpenFilesEvent; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +import javax.imageio.ImageIO; +import javax.swing.JFrame; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.SwingUtilities; + +import org.apache.commons.io.FileUtils; + +@SuppressWarnings("serial") +public class HelloWorldFrame extends JFrame { + + private static String [] args; + + public HelloWorldFrame() throws IOException { + super("Hello World"); + initFrame(); + initContent(); + setVisible(true); + setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH); + } + + public void initContent() throws IOException { + + File info = new File("info.txt"); + + String content = FileUtils.readFileToString(info, StandardCharsets.UTF_8); + + JTextArea text = new JTextArea(); + text.setFont(new Font("monospaced", Font.PLAIN, 12)); + text.setEditable(false); + + getContentPane().setLayout(new BorderLayout()); + getContentPane().add(new JScrollPane(text), BorderLayout.CENTER); + + StringBuffer buffer = new StringBuffer(); + buffer.append("Additional resource: " + info + "\n"); + buffer.append("Content: " + content + "\n\n"); + + buffer.append("==============================================\n"); + buffer.append("ARGUMENTS ====================================\n"); + buffer.append("==============================================\n\n"); + buffer.append("args=" + Arrays.asList(args) + "\n"); + buffer.append("\n"); + + buffer.append("==============================================\n"); + buffer.append("ENVIRONMENT VARIABLES ========================\n"); + buffer.append("==============================================\n\n"); + List envKeys = System.getenv().keySet().stream().collect(Collectors.toList()); + Collections.sort(envKeys, (a, b) -> a.compareTo(b)); + for (String key : envKeys) { + buffer.append(key + "=" + System.getenv(key) + "\n"); + } + buffer.append("\n"); + + buffer.append("==============================================\n"); + buffer.append("PROPERTIES ===================================\n"); + buffer.append("==============================================\n\n"); + List propKeys = System.getProperties().keySet().stream().collect(Collectors.toList()); + Collections.sort(propKeys, (a, b) -> a.toString().compareTo(b.toString())); + for (Object key : propKeys) { + buffer.append(key + "=" + System.getProperty("" + key) + "\n"); + } + + text.setText(buffer.toString()); + + } + + public void initFrame() throws IOException { + setSize(640, 200); + setLocationRelativeTo(null); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setIconImage(ImageIO.read(getClass().getResourceAsStream("/images/world.png"))); + } + + public static void main(String[] args) { + + HelloWorldFrame.args = args; + + // read double-clicked files on mac os +// if (System.getProperty("os.name").contains("OS X")) { +// +// java.awt.Desktop.getDesktop().setOpenFileHandler((java.awt.desktop.OpenFilesEvent e) -> { +// File f = e.getFiles().stream().findFirst().get(); +// HelloWorldFrame.args = new String[] { f.getAbsolutePath() }; +// }); +// +// } + + System.out.println("Starting app ... "); + System.out.println("PATH=" + System.getenv("PATH")); + SwingUtilities.invokeLater(new Runnable() { + public void run() { + try { + HelloWorldFrame.args = args; + new HelloWorldFrame(); + } catch (IOException e) { + e.printStackTrace(); + } + } + }); + } + +} diff --git a/test/hello-world-gradle/src/main/java/io/github/fvarrui/helloworld/Main.java b/test/hello-world-gradle/src/main/java/io/github/fvarrui/helloworld/Main.java new file mode 100644 index 00000000..ec4738ca --- /dev/null +++ b/test/hello-world-gradle/src/main/java/io/github/fvarrui/helloworld/Main.java @@ -0,0 +1,13 @@ +package io.github.fvarrui.helloworld; + +public class Main { + + public static void main(String[] args) { + if (args.length > 0 && args[0].equals("--help")) { + System.out.println("HelloWorld 1.0.0"); + return; + } + HelloWorldFrame.main(args); + } + +} diff --git a/test/hello-world-gradle/src/main/resources/images/world.png b/test/hello-world-gradle/src/main/resources/images/world.png new file mode 100644 index 0000000000000000000000000000000000000000..4ecb0f2de41b4f8291e0de549a66d7a9500c8db2 GIT binary patch literal 17690 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 Z{|`GTkx~_&7cl?;002ovPDHLkV1nZe215V< literal 0 HcmV?d00001 diff --git a/test/hello-world-gradle/src/main/resources/info.txt b/test/hello-world-gradle/src/main/resources/info.txt new file mode 100644 index 00000000..f5c4294c --- /dev/null +++ b/test/hello-world-gradle/src/main/resources/info.txt @@ -0,0 +1 @@ +Heeellllloooooooo!!! \ No newline at end of file diff --git a/test/hello-world-maven/.circleci/config.yml b/test/hello-world-maven/.circleci/config.yml new file mode 100644 index 00000000..e69de29b diff --git a/test/hello-world-maven/.gitattributes b/test/hello-world-maven/.gitattributes new file mode 100644 index 00000000..dfe07704 --- /dev/null +++ b/test/hello-world-maven/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/test/hello-world-maven/.github/workflows/package.yml b/test/hello-world-maven/.github/workflows/package.yml new file mode 100644 index 00000000..e955e95e --- /dev/null +++ b/test/hello-world-maven/.github/workflows/package.yml @@ -0,0 +1,24 @@ +name: Packaging for Windows +on: workflow_dispatch # manually triggered +jobs: + windows: + runs-on: windows-latest + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v1 + with: + java-version: 11 + - name: Set path for candle and light + run: echo "C:\Program Files (x86)\WiX Toolset v3.11\bin" >> $GITHUB_PATH + shell: bash + - name: Package app + run: mvn clean package + - uses: actions/upload-artifact@v2 + with: + name: Windows Setup Installer (.exe) + path: target/HelloWorldMaven_*.exe + - uses: actions/upload-artifact@v2 + with: + name: Windows MSI Installer (.msi) + path: target/HelloWorldMaven_*.msi diff --git a/test/hello-world-maven/.gitignore b/test/hello-world-maven/.gitignore new file mode 100644 index 00000000..aa3b4f16 --- /dev/null +++ b/test/hello-world-maven/.gitignore @@ -0,0 +1,5 @@ +target +.classpath +.project +.settings +jdks \ No newline at end of file diff --git a/test/hello-world-maven/CustomMessages_en.isl b/test/hello-world-maven/CustomMessages_en.isl new file mode 100644 index 00000000..1ce6192e --- /dev/null +++ b/test/hello-world-maven/CustomMessages_en.isl @@ -0,0 +1,2 @@ +[Messages] +WelcomeLabel2=This will install [name/ver] on your system. diff --git a/test/hello-world-maven/CustomMessages_es.isl b/test/hello-world-maven/CustomMessages_es.isl new file mode 100644 index 00000000..7f92454e --- /dev/null +++ b/test/hello-world-maven/CustomMessages_es.isl @@ -0,0 +1,2 @@ +[Messages] +WelcomeLabel2=Se va a instalar [name/ver] en tu sistema. diff --git a/test/hello-world-maven/LICENSE b/test/hello-world-maven/LICENSE new file mode 100644 index 00000000..e62ec04c --- /dev/null +++ b/test/hello-world-maven/LICENSE @@ -0,0 +1,674 @@ +GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/test/hello-world-maven/README.md b/test/hello-world-maven/README.md new file mode 100644 index 00000000..0013138f --- /dev/null +++ b/test/hello-world-maven/README.md @@ -0,0 +1,3 @@ +# HelloWorld + +JavaPackager sample project. \ No newline at end of file diff --git a/test/hello-world-maven/assets/HelloWorldMaven.icns b/test/hello-world-maven/assets/HelloWorldMaven.icns new file mode 100644 index 0000000000000000000000000000000000000000..1a4d763822a8b8e38c29cb5234d7c4c664339a33 GIT binary patch literal 71373 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 Q9@ka|!!|sWd+T%mAK@=7#{d8T literal 0 HcmV?d00001 diff --git a/test/hello-world-maven/assets/HelloWorldMaven.png b/test/hello-world-maven/assets/HelloWorldMaven.png new file mode 100644 index 0000000000000000000000000000000000000000..ca4f09f61cda8c1e898aa9a0ffa03f15f8d278ed GIT binary patch literal 10255 zcmb_i};DK|-3Lq`PyFknZk~M!JR)q-zN28t(k= zzi{t|bI$YZPw(0LJ!`#dtrM=MBKI8YB^Cexc>Y0N`XlNI{qKUHqwc>%%|-zLhWQWD z5}F=Mh-{2B(*DOM>nh+NW&|iN3?7tQTqE-+r*1wAo3bg!dPm0nwpffJ0Gh}6`33eT z#aG@E`b2&;GW~rj%)09M*u~Ii(wa+ik6k9e##38P5KSwq*ZilBIo7c3)kRJrn6VWv z`&i+J)Z7}ONyC>-+^@w6*~TD~eTrNl?z8DAfO7l)ZAt7MxOpeT?w_KfVx*=6!FMx7 zhs?4+Zy|y6OA%UMN-EfQ=CK^?+#WwWlxaR0FZidXrVcvmMUt?L$VQQ=Pr=s~@GTQ1 zp=XJ{p8XNTLWdVupy@`Cu66cdt}g{u)3fy@3Iu|$^wryi&2dk+ zE4%t9>m ztaUM?Hh07;kTjk{+ks&jJeFWmztP?{A~F&oo2^V_9}y9uBq0$nJTcLf`Cjs+hMu17 z$mpoDo?iOu1#4S{amSM5YzwPQ$!w$eL{`yt`*NvP*-`3Un2wW^t~51fL9u|iO<^9hrE2q&C3Is zeg|35bcZYjLaKiNr~vjNLOoy)t6-uZar6LnaJyOfo$mKF zG0P1An0@-cSdCi2OTT%S?Fk(l=ClLQ=X{wf& z#`@D4`EpA^bv65>RlMY5%~0cZioy3K(B&W}c?X)R1&;Bl$yf2Uz<9xGC)j=%nIl8E3-xlae;X?9*f5O51;mhLhzA1nG z>*@4{HfYg(*+F@CJlkQ7K*Yr7Eadj|7v9)Pi_2K5iC_9&)7@G89aoKVChxasDxs_M z0jR{M72d5;@J&MUdmUWj23XmzO0^7h+P%fPqDAkM4k>k=)3ZV9OgzyW8pCSSfI=tO zJF|r$m*w-O$%3YU{kTs3RPMa|TFE60>9|=b;3y~IBO}W~yK;xs+ zi@61x30MEGZG$Y+e_(-Sa6zo1INGFQYj4B z=@uSm4mWwaTOi*bxLC5Q8k;$94J*c-pVu&tWNHt|D3#_nu@%z^zRVgpjXs|c6RW74 zGKH`^t~85_iyCM?S^Me^UoC&3e&u~sqiuGNdL@Tse%&|XsbuU+I@lv~+zr=+=)FC^_m%ws*wLwBK+iC$QR3Ws+^_^J_NY1hI@^P-XED0fEB8gpJ-ckOnm3sZ#E)l zN4b$5A>deE2x#ahf@u+%u;q0&`9mtY4|+Q&hK!#K%pcDjl7n5k*p2>KJ%7BW??S5SG~OW40(?7Ba0+u1LI{k+YLp%Qu} z>~*nsdzEt+3!Bus80(U1|qPQr%WknNb)U9&`7(snWcoYTKd|OCQ&`^d#vT+KMLPS4pMwByWAB%^Fq}0 z^*?Ku>k>o+1|c8sL;3!Ah}I`GAli9UJF0yi z*Y&W?#!~1_MHBDTQMsIH`qHYIKLGK*bzrtcOwiErng-Tydox4iqBYE6 z!fYUlTI^L0Nr1ep$JO}}_9Q@Nq7ezLEFehLd0%Sa~&%SbAktA<+362O!%F#LtK zSfw`J=0s8Zpb*=7=1AcD&vqv+2ZWMmB#W|b+FOTvy#S(aDJXGuGKst<8xdgnPxE7Y{-loyu&g4>v__Cj_cL` zv;zjp#!!03By~{uBhO(NVNjbR&|>a9ZuASDkMAUg6*T?kma07v3ArAKjp~LgmeEeo zWFFrpt0AdUfXs5PLW6bX7d*S1Nc`NTd#Qz@wB5m#O|j8Go5!JcNliyK3Xx6E6%D@O zj?`DZv&l{_BX^YN&om{h+~ArJP81GNi{Qyhx=QZv@6WGaefybh0-e=-AWFdapWk-~ zVKe=o29L81H4@;a=oo?*l@GVaz zH7+tSf0<*7+p9)&rl2+G-}J1>jlK@Q zaiACNWMyKqrHx6T>DDUK4w)%Z-M#&?jRpKe*yt{W%s;!oVo(@EQKr=&uR|7Z91#Cl zeer|AjQh6mjMX+qX_fq`73@-5$o*1tS7a~E{$zN&?&B)q4@FCL1C1qj9gX?Qwvu

b+_*aWp+S{Xn6{+Jm21zW~c?4x2qRn1J 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 b?b8#LCg&EVJPztdKfnhW73oSz)4=}$t$zE` literal 0 HcmV?d00001 diff --git a/test/hello-world-maven/assets/linux/HelloWorldMaven.png b/test/hello-world-maven/assets/linux/HelloWorldMaven.png new file mode 100644 index 0000000000000000000000000000000000000000..4ecb0f2de41b4f8291e0de549a66d7a9500c8db2 GIT binary patch literal 17690 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 Z{|`GTkx~_&7cl?;002ovPDHLkV1nZe215V< literal 0 HcmV?d00001 diff --git a/test/hello-world-maven/assets/mac/HelloWorldMaven.icns b/test/hello-world-maven/assets/mac/HelloWorldMaven.icns new file mode 100644 index 0000000000000000000000000000000000000000..c70ef7793a1632a83cabee5c3d14b9665baad743 GIT binary patch literal 104590 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 Gf&UFEnO58Y literal 0 HcmV?d00001 diff --git a/test/hello-world-maven/assets/windows/HelloWorldMaven.ico b/test/hello-world-maven/assets/windows/HelloWorldMaven.ico new file mode 100644 index 0000000000000000000000000000000000000000..12a838fcb2ec99d4f4fc105928d9ec09e01fa348 GIT binary patch literal 209948 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 &&-)K=bV{& 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 + + 4.0.0 + + io.github.fvarrui + HelloWorldMaven + 1.0.0 + + + 11 + 11 + UTF-8 + io.github.fvarrui.helloworld.Main + + + + + local + file:~/.m2/repository + + + central + Maven Central + https://repo1.maven.org/maven2/ + + + + + + commons-io + commons-io + 2.7 + + + + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + + + ${exec.mainClass} + + + + jar-with-dependencies + + + + + make-assembly + package + + single + + + + + + + + io.github.fvarrui + javapackager + LATEST + + + package + + package + + + windows + ${exec.mainClass} + true + true + true + true + + src/main/resources/info.txt + + + -Dcustom.variable="Hi!" + -Dother.custom.variable="Bye!" + + + + HelloWorld File + hello + application/hello + + + + + + + + + + + \ No newline at end of file diff --git a/test/hello-world-maven/src/main/java/io/github/fvarrui/helloworld/HelloWorldFrame.java b/test/hello-world-maven/src/main/java/io/github/fvarrui/helloworld/HelloWorldFrame.java new file mode 100644 index 00000000..f43afa05 --- /dev/null +++ b/test/hello-world-maven/src/main/java/io/github/fvarrui/helloworld/HelloWorldFrame.java @@ -0,0 +1,115 @@ +package io.github.fvarrui.helloworld; + +import java.awt.BorderLayout; +import java.awt.Font; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +import javax.imageio.ImageIO; +import javax.swing.JFrame; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.SwingUtilities; + +import org.apache.commons.io.FileUtils; + +@SuppressWarnings("serial") +public class HelloWorldFrame extends JFrame { + + private static String[] args; + + public HelloWorldFrame() throws IOException { + super("Hello World"); + initFrame(); + initContent(); + setVisible(true); + setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH); + } + + public void initContent() throws IOException { + + File info = new File("info.txt"); + + String content = FileUtils.readFileToString(info, StandardCharsets.UTF_8); + + JTextArea text = new JTextArea(); + text.setFont(new Font("monospaced", Font.PLAIN, 12)); + text.setEditable(false); + + getContentPane().setLayout(new BorderLayout()); + getContentPane().add(new JScrollPane(text), BorderLayout.CENTER); + + StringBuffer buffer = new StringBuffer(); + buffer.append("Additional resource: " + info + "\n"); + buffer.append("Content: " + content + "\n\n"); + + buffer.append("==============================================\n"); + buffer.append("ARGUMENTS ====================================\n"); + buffer.append("==============================================\n\n"); + buffer.append("args=" + Arrays.asList(args) + "\n"); + buffer.append("\n"); + + buffer.append("==============================================\n"); + buffer.append("ENVIRONMENT VARIABLES ========================\n"); + buffer.append("==============================================\n\n"); + List envKeys = System.getenv().keySet().stream().collect(Collectors.toList()); + Collections.sort(envKeys, (a, b) -> a.compareTo(b)); + for (String key : envKeys) { + buffer.append(key + "=" + System.getenv(key) + "\n"); + } + buffer.append("\n"); + + buffer.append("==============================================\n"); + buffer.append("PROPERTIES ===================================\n"); + buffer.append("==============================================\n\n"); + List propKeys = System.getProperties().keySet().stream().collect(Collectors.toList()); + Collections.sort(propKeys, (a, b) -> a.toString().compareTo(b.toString())); + for (Object key : propKeys) { + buffer.append(key + "=" + System.getProperty("" + key) + "\n"); + } + + text.setText(buffer.toString()); + + } + + public void initFrame() throws IOException { + setSize(640, 200); + setLocationRelativeTo(null); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setIconImage(ImageIO.read(getClass().getResourceAsStream("/images/world.png"))); + } + + public static void main(String[] args) { + + HelloWorldFrame.args = args; + + // read double-clicked files on mac os +// if (System.getProperty("os.name").contains("OS X")) { +// +// java.awt.Desktop.getDesktop().setOpenFileHandler((java.awt.desktop.OpenFilesEvent e) -> { +// File f = e.getFiles().stream().findFirst().get(); +// HelloWorldFrame.args = new String[] { f.getAbsolutePath() }; +// }); +// +// } + + System.out.println("Starting app ... "); + System.out.println("PATH=" + System.getenv("PATH")); + SwingUtilities.invokeLater(new Runnable() { + public void run() { + try { + new HelloWorldFrame(); + } catch (IOException e) { + e.printStackTrace(); + } + } + }); + + } + +} diff --git a/test/hello-world-maven/src/main/java/io/github/fvarrui/helloworld/Main.java b/test/hello-world-maven/src/main/java/io/github/fvarrui/helloworld/Main.java new file mode 100644 index 00000000..4e718024 --- /dev/null +++ b/test/hello-world-maven/src/main/java/io/github/fvarrui/helloworld/Main.java @@ -0,0 +1,38 @@ +package io.github.fvarrui.helloworld; + +import java.lang.module.ModuleDescriptor; + +public class Main { + + public static void main(String[] args) { + if (args.length > 0) { + String argument = args[0]; + switch (argument) { + case "--version": + version(); + return; + case "--module-info": + moduleInfo(); + return; + } + } + HelloWorldFrame.main(args); + } + + private static void version() { + System.out.println("HelloWorld 1.0.0"); + } + + private static void moduleInfo() { + ModuleDescriptor descriptor = Main.class.getModule().getDescriptor(); + if (descriptor != null) { + System.out.println("Modular version of HelloWorldMaven:"); + System.out.println("- Module name : " + descriptor.name()); + System.out.println("- Requires : " + descriptor.requires()); + System.out.println("- Exports : " + descriptor.exports()); + } else { + System.out.println("Non modular version of HelloWorldMaven!"); + } + } + +} diff --git a/test/hello-world-maven/src/main/resources/images/world.png b/test/hello-world-maven/src/main/resources/images/world.png new file mode 100644 index 0000000000000000000000000000000000000000..4ecb0f2de41b4f8291e0de549a66d7a9500c8db2 GIT binary patch literal 17690 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 Z{|`GTkx~_&7cl?;002ovPDHLkV1nZe215V< literal 0 HcmV?d00001 diff --git a/test/hello-world-maven/src/main/resources/info.txt b/test/hello-world-maven/src/main/resources/info.txt new file mode 100644 index 00000000..f5c4294c --- /dev/null +++ b/test/hello-world-maven/src/main/resources/info.txt @@ -0,0 +1 @@ +Heeellllloooooooo!!! \ No newline at end of file From 1aeb33af830b291d4491ebb2cc1567fb663f8b0f Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Wed, 3 Aug 2022 18:39:12 +0200 Subject: [PATCH 25/74] removed bloat from hello world projects --- test/hello-world-gradle/.vscode/settings.json | 0 test/hello-world-gradle/gradle/wrapper/gradle-wrapper.jar | 0 test/hello-world-gradle/gradle/wrapper/gradle-wrapper.properties | 0 test/hello-world-maven/.circleci/config.yml | 0 4 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 test/hello-world-gradle/.vscode/settings.json delete mode 100644 test/hello-world-gradle/gradle/wrapper/gradle-wrapper.jar delete mode 100644 test/hello-world-gradle/gradle/wrapper/gradle-wrapper.properties delete mode 100644 test/hello-world-maven/.circleci/config.yml diff --git a/test/hello-world-gradle/.vscode/settings.json b/test/hello-world-gradle/.vscode/settings.json deleted file mode 100644 index e69de29b..00000000 diff --git a/test/hello-world-gradle/gradle/wrapper/gradle-wrapper.jar b/test/hello-world-gradle/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index e69de29b..00000000 diff --git a/test/hello-world-gradle/gradle/wrapper/gradle-wrapper.properties b/test/hello-world-gradle/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index e69de29b..00000000 diff --git a/test/hello-world-maven/.circleci/config.yml b/test/hello-world-maven/.circleci/config.yml deleted file mode 100644 index e69de29b..00000000 From 9c7c8db6f36e513b437ae53977d26749a5543c6d Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Wed, 3 Aug 2022 21:55:23 +0200 Subject: [PATCH 26/74] unified maven and gradle tasks --- .../fvarrui/javapackager/PackageTask.java | 1455 +++++++++++++++++ .../gradle/AbstractPackageTask.java | 64 - .../gradle/DefaultPackageTask.java | 67 - .../javapackager/gradle/PackagePlugin.java | 5 +- .../gradle/PackagePluginExtension.java | 87 - .../javapackager/gradle/PackageTask.java | 646 -------- .../javapackager/ideas/MyGradleTask.java | 11 - .../javapackager/ideas/MyMavenTask.java | 4 - .../javapackager/ideas/MySettings.java | 14 - .../javapackager/maven/PackageMojo.java | 404 ----- .../javapackager/packagers/Packager.java | 3 +- .../packagers/PackagerFactory.java | 29 - .../packagers/PackagerSettings.java | 920 ----------- test/hello-world-gradle/build.gradle | 4 + 14 files changed, 1464 insertions(+), 2249 deletions(-) create mode 100644 src/main/java/io/github/fvarrui/javapackager/PackageTask.java delete mode 100644 src/main/java/io/github/fvarrui/javapackager/gradle/AbstractPackageTask.java delete mode 100644 src/main/java/io/github/fvarrui/javapackager/gradle/DefaultPackageTask.java delete mode 100644 src/main/java/io/github/fvarrui/javapackager/gradle/PackagePluginExtension.java delete mode 100644 src/main/java/io/github/fvarrui/javapackager/gradle/PackageTask.java delete mode 100644 src/main/java/io/github/fvarrui/javapackager/ideas/MyGradleTask.java delete mode 100644 src/main/java/io/github/fvarrui/javapackager/ideas/MyMavenTask.java delete mode 100644 src/main/java/io/github/fvarrui/javapackager/ideas/MySettings.java delete mode 100644 src/main/java/io/github/fvarrui/javapackager/maven/PackageMojo.java delete mode 100644 src/main/java/io/github/fvarrui/javapackager/packagers/PackagerFactory.java delete mode 100644 src/main/java/io/github/fvarrui/javapackager/packagers/PackagerSettings.java diff --git a/src/main/java/io/github/fvarrui/javapackager/PackageTask.java b/src/main/java/io/github/fvarrui/javapackager/PackageTask.java new file mode 100644 index 00000000..5335eb8e --- /dev/null +++ b/src/main/java/io/github/fvarrui/javapackager/PackageTask.java @@ -0,0 +1,1455 @@ +package io.github.fvarrui.javapackager; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import groovy.lang.Closure; +import io.github.fvarrui.javapackager.gradle.PackagePlugin; +import io.github.fvarrui.javapackager.maven.MavenContext; +import io.github.fvarrui.javapackager.model.*; +import io.github.fvarrui.javapackager.packagers.*; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.SystemUtils; +import org.apache.maven.execution.MavenSession; +import org.apache.maven.plugin.*; +import org.apache.maven.plugin.logging.Log; +import org.apache.maven.plugin.logging.SystemStreamLog; +import org.apache.maven.plugins.annotations.Component; +import org.apache.maven.plugins.annotations.LifecyclePhase; +import org.apache.maven.plugins.annotations.Parameter; +import org.apache.maven.plugins.annotations.ResolutionScope; +import org.apache.maven.project.MavenProject; +import org.gradle.api.DefaultTask; +import org.gradle.api.Project; +import org.gradle.api.tasks.*; + +import static org.twdata.maven.mojoexecutor.MojoExecutor.executionEnvironment; + +/** + * Package task that gets detected by maven and gradle. + */ +@org.apache.maven.plugins.annotations.Mojo(name = "package", defaultPhase = LifecyclePhase.PACKAGE, requiresDependencyResolution = ResolutionScope.RUNTIME) +public class PackageTask extends DefaultTask implements Mojo, ContextEnabled { + public PackageTask() { + this.isGradle = Context.isGradle(); + this.project = (isGradle ? Context.getGradleContext().getProject() : null); + if(isGradle){ + setGroup(PackagePlugin.GROUP_NAME); + setDescription("Packages the application as a native Windows, Mac OS X or GNU/Linux executable and creates an installer"); + getOutputs().upToDateWhen(o -> false); + } + + this.outputDirectory = (isGradle ? project.getBuildDir() : new File("${project.build.directory}")); + this.platform = Platform.getCurrentPlatform(); + this.bundleJre = true; + this.copyDependencies = true; + this.createTarball = false; + this.createZipball = false; + this.description = project.getDescription(); + this.generateInstaller = true; + this.linuxConfig = new LinuxConfig(); + this.macConfig = new MacConfig(); + this.manifest = new Manifest(); + this.modules = new ArrayList<>(); + this.forceInstaller = false; + this.mainClass = "${exec.mainClass}"; //TODO gradle? + this.name = (isGradle ? project.getName() : "${project.name}"); + this.displayName = (isGradle ? project.getName() : "${project.name}"); + this.version = (isGradle ? (String) project.getVersion() : "${project.version}"); + this.description = (isGradle ? project.getDescription(): "${project.description}"); + this.url = "${project.url}"; //TODO gradle? + this.administratorRequired = false; + this.organizationName = (isGradle ? null : "${project.organization.name}"); + this.organizationUrl = (isGradle ? null : "${project.organization.url}"); + this.organizationEmail = ""; + this.bundleJre = false; + this.customizedJre = true; + this.jrePath = null; + this.jdkPath = null; + this.jdkVersion = "8"; + this.jdkVendor = "adoptium"; + this.additionalResources = new ArrayList<>(); + this.modules = new ArrayList<>(); + this.additionalModules = new ArrayList<>(); + this.envPath = null; + this.vmArgs = new ArrayList<>(); + this.runnableJar = null; + this.copyDependencies = true; + this.jreDirectoryName = "jre"; + winConfig(new WindowsConfig()); + linuxConfig(new LinuxConfig()); + macConfig(new MacConfig()); + this.createTarball = false; + this.createZipball = false; + this.extra = new HashMap<>(); + this.useResourcesAsWorkingDir = true; + this.assetsDir = (isGradle ? new File(project.getProjectDir(), "assets") : new File("${project.basedir}/assets")); + this.classpath = null; + this.jreMinVersion = null; + manifest(new Manifest()); + this.additionalModulePaths = new ArrayList<>(); + this.fileAssociations = null; + this.packagingJdk = (isGradle ? null : new File("${java.home}")); // todo gradle + scripts(new Scripts()); + } + + /* + GRADLE SPECIFIC + */ + private boolean isGradle; + private Project project; + private List outputFiles; + + @OutputFiles + public List getOutputFiles() { + return outputFiles != null ? outputFiles : new ArrayList<>(); + } + + /** + * Packaging task action + * @throws Exception Throwed if something went wrong + */ + @TaskAction + public void doPackage() throws Exception { + + Packager packager = this.createPackager(); + new PackageTask(); + // generates app, installers and bundles + File app = packager.createApp(); + List installers = packager.generateInstallers(); + List bundles = packager.createBundles(); + + // sets generated files as output + outputFiles = new ArrayList<>(); + outputFiles.add(app); + outputFiles.addAll(installers); + outputFiles.addAll(bundles); + + } + + /* + MAVEN SPECIFIC + */ + @Parameter(defaultValue = "${project}", readonly = true) + private MavenProject mavenProject; + @Parameter(defaultValue = "${session}", readonly = true) + private MavenSession mavenSession; + @Component + private BuildPluginManager pluginManager; + + private Log log; + private Map pluginContext; + + @Override + public void execute() throws MojoExecutionException { + Context.setContext( + new MavenContext( + executionEnvironment(mavenProject, mavenSession, pluginManager), + getLog() + ) + ); + try { + Packager packager = this.createPackager(); + // generate app, installers and bundles + packager.createApp(); + packager.generateInstallers(); + packager.createBundles(); + } catch (Exception e) { + throw new MojoExecutionException(e.getMessage(), e); + } + } + + public void setLog(Log log) { + this.log = log; + } + + public Log getLog() { + if (this.log == null) { + this.log = new SystemStreamLog(); + } + + return this.log; + } + + public Map getPluginContext() { + return this.pluginContext; + } + + public void setPluginContext(Map pluginContext) { + this.pluginContext = pluginContext; + } + + public Packager createPackager(){ + Packager packager = null; + switch (platform) { + case mac: + packager = new MacPackager(); break; + case linux: + packager = new LinuxPackager(); break; + case windows: + packager = new WindowsPackager(); break; + default: + throw new RuntimeException("Unsupported operating system: " + SystemUtils.OS_NAME + " " + SystemUtils.OS_VERSION + " " + SystemUtils.OS_ARCH); + } + packager.platform(platform); + return packager; + } + + /* + CONFIGURATION OF TASK + */ + + // GRADLE SPECIFIC START + public LinuxConfig linuxConfig(Closure closure) { + linuxConfig = new LinuxConfig(); + project.configure(linuxConfig, closure); + return linuxConfig; + } + + public MacConfig macConfig(Closure closure) { + macConfig = new MacConfig(); + project.configure(macConfig, closure); + return macConfig; + } + + public WindowsConfig winConfig(Closure closure) { + winConfig = new WindowsConfig(); + project.configure(winConfig, closure); + return winConfig; + } + + public Manifest manifest(Closure closure) { + manifest = new Manifest(); + project.configure(manifest, closure); + return manifest; + } + + public Scripts scripts(Closure closure) { + scripts = new Scripts(); + project.configure(scripts, closure); + return scripts; + } + // GRADLE SPECIFIC END + + /** + * Output directory. + */ + @Parameter(property = "outputDirectory", required = false) + @OutputDirectory + @Optional + protected File outputDirectory; + + /** + * Path to project license file. + */ + @Parameter(property = "licenseFile") + @InputFile + @Optional + protected File licenseFile; + + /** + * Path to the app icon file (PNG, ICO or ICNS). + */ + @Parameter(property = "iconFile") + @InputFile + @Optional + protected File iconFile; + + /** + * Generates an installer for the app. + */ + @Parameter(property = "generateInstaller") + @Input + @Optional + protected Boolean generateInstaller; + + /** + * Forces installer generation. + */ + @Parameter(property = "forceInstaller") + @Input + @Optional + protected boolean forceInstaller; + + /** + * Full path to your app main class. + */ + @Parameter(property = "mainClass", required = true) + @Input + @Optional + protected String mainClass; + + /** + * App name. + */ + @Parameter(property = "name") + @Input + @Optional + protected String name ; + + /** + * App name to show. + */ + @Parameter(property = "displayName") + @Input + @Optional + protected String displayName; + + /** + * Project version. + */ + @Parameter(property = "version") + @Input + @Optional + protected String version; + + /** + * Project description. + */ + @Parameter(property = "description") + @Input + @Optional + protected String description; + + /** + * App website URL. + */ + @Parameter(property = "url") + @Input + @Optional + protected String url; + + /** + * App will run as administrator (with elevated privileges). + */ + @Parameter(property = "administratorRequired") + @Input + @Optional + protected Boolean administratorRequired; + + /** + * Organization name. + */ + @Parameter(property = "organizationName", required = false) + @Input + @Optional + protected String organizationName; + + /** + * Organization website URL. + */ + @Parameter(property = "organizationUrl", required = false) + @Input + @Optional + protected String organizationUrl; + + /** + * Organization email. + */ + @Parameter(property = "organizationEmail", required = false) + @Input + @Optional + protected String organizationEmail; + /** + * Embeds a customized JRE with the app. + */ + @Parameter(property = "bundleJre", required = false) + @Input + @Optional + protected Boolean bundleJre; + + /** + * Generates a customized JRE, including only identified or specified modules. Otherwise, all modules will be included. + */ + @Parameter(property = "customizedJre", required = false) + @Input + @Optional + protected Boolean customizedJre; + + /** + * Path to JRE folder. If specified, it will bundle this JRE with the app, and won't generate a customized JRE. For Java 8 version or least. + */ + @Parameter(property = "jrePath", required = false) + @InputDirectory + @Optional + protected File jrePath; + + /** + * Path to JDK folder. If specified, it will use this JDK modules to generate a customized JRE. Allows generating JREs for different platforms. + */ + @Parameter(property = "jdkPath", required = false) + @InputDirectory + @Optional + protected File jdkPath; + + /** + * The JDK version. Supported versions differ from vendor to vendor, thus its recommended checking the vendors' website first before doing any changes. + */ + @Parameter(property = "jdkVersion", required = false) + @Input + @Optional + protected String jdkVersion = "8"; + + /** + * The JDK vendor. + */ + @Parameter(property = "jdkVendor", required = false) + @Input + @Optional + protected String jdkVendor = "adoptium"; + + /** + * Additional files and folders to include in the bundled app. + */ + @Parameter(property = "additionalResources", required = false) + @Input + @Optional + protected List additionalResources; + + /** + * Defines modules to customize the bundled JRE. Don't use jdeps to get module dependencies. + */ + @Parameter(property = "modules", required = false) + @Input + @Optional + protected List modules; + + /** + * Additional modules to the ones identified by jdeps or the specified with modules property. + */ + @Parameter(property = "additionalModules", required = false) + @Input + @Optional + protected List additionalModules; + + /** + * Which platform to build, one of: + *
    + *
  • auto - automatically detect based on the host OS (the default)
  • + *
  • mac
  • + *
  • linux
  • + *
  • windows
  • + *
+ * To build for multiple platforms at once, add multiple executions to the plugin's configuration. + */ + @Parameter(property = "platform", required = true) + @Input + @Optional + protected Platform platform; + + /** + * Defines PATH environment variable in GNU/Linux and Mac OS X startup scripts. + */ + @Parameter(property = "envPath", required = false) + @Input + @Optional + protected String envPath; + + /** + * Additional arguments to provide to the JVM (for example -Xmx2G). + */ + @Parameter(property = "vmArgs", required = false) + @Input + @Optional + protected List vmArgs; + + /** + * Provide your own runnable .jar (for example, a shaded .jar) instead of letting this plugin create one via + * the maven-jar-plugin. + */ + @Parameter(property = "runnableJar", required = false) + @InputFile + @Optional + protected File runnableJar; + + /** + * Whether or not to copy dependencies into the bundle. Generally, you will only disable this if you specified + * a runnableJar with all dependencies shaded into the .jar itself. + */ + @Parameter(property = "copyDependencies", required = true) + @Input + @Optional + protected Boolean copyDependencies; + + /** + * Bundled JRE directory name + */ + @Parameter(property = "jreDirectoryName", required = false) + @Input + @Optional + protected String jreDirectoryName; + /** + * Windows specific config + */ + @Parameter(property = "winConfig", required = false) + @Input + @Optional + protected WindowsConfig winConfig; + + /** + * GNU/Linux specific config + */ + @Parameter(property = "linuxConfig", required = false) + @Input + @Optional + protected LinuxConfig linuxConfig; + + /** + * Mac OS X specific config + */ + @Parameter(property = "macConfig", required = false) + @Input + @Optional + protected MacConfig macConfig; + + /** + * Bundles app in a tarball file + */ + @Parameter(property = "createTarball", required = false) + @Input + @Optional + protected Boolean createTarball; + + /** + * Bundles app in a zipball file + */ + @Parameter(property = "createZipball", required = false) + @Input + @Optional + protected Boolean createZipball; + + /** + * Extra properties for customized Velocity templates, accesible through '$this.extra' map. + */ + @Parameter(required = false) + @Input + @Optional + protected Map extra; + + /** + * Uses app resources folder as default working directory. + */ + @Parameter(property = "useResourcesAsWorkingDir", required = false) + @Input + @Optional + protected boolean useResourcesAsWorkingDir; + + /** + * Assets directory + */ + @Parameter(property = "assetsDir", required = false) + @InputDirectory + @Optional + protected File assetsDir; + + /** + * Classpath + */ + @Parameter(property = "classpath", required = false) + @Input + @Optional + protected String classpath; + /** + * JRE min version + */ + @Parameter(property = "jreMinVersion", required = false) + @Input + @Optional + protected String jreMinVersion; + + /** + * Additional JAR manifest entries + */ + @Parameter(required = false) + @Input + @Optional + protected Manifest manifest; + + /** + * Additional module paths + */ + @Parameter(property = "additionalModulePaths", required = false) + @Input + @Optional + protected List additionalModulePaths; + + /** + * Additional module paths + */ + @Parameter(property = "fileAssociations", required = false) + @Input + @Optional + protected List fileAssociations; + + /** + * Packaging JDK + */ + @Parameter(property = "packagingJdk", required = false) + @InputDirectory + @Optional + protected File packagingJdk; + + /** + * Scripts + */ + @Parameter(property = "scripts", required = false) + @Input + @Optional + protected Scripts scripts; + + /** + * Get packaging JDK + * @return Packaging JDK + */ + public File getPackagingJdk() { + return packagingJdk; + } + + /** + * Get output directory + * @return Output directory + */ + public File getOutputDirectory() { + return outputDirectory; + } + + /** + * Get license file + * @return License file + */ + public File getLicenseFile() { + return licenseFile; + } + + /** + * Get icon file + * @return Icon file + */ + public File getIconFile() { + return iconFile; + } + + /** + * Get generate installer + * @return Generate installer + */ + public Boolean getGenerateInstaller() { + return generateInstaller; + } + + /** + * Get force installer + * @return Force installer + */ + public boolean isForceInstaller() { + return forceInstaller; + } + + /** + * Get main class + * @return Main class + */ + public String getMainClass() { + return mainClass; + } + + /** + * Get name + * @return Name + */ + public String getName() { + return name; + } + + /** + * Get display name + * @return Display name + */ + public String getDisplayName() { + return displayName; + } + + /** + * Get version + * @return Version + */ + public String getVersion() { + return version; + } + + /** + * Get description + * @return Description + */ + public String getDescription() { + return description; + } + + /** + * Get URL + * @return URL + */ + public String getUrl() { + return url; + } + + /** + * Get administrator required + * @return Administrator required + */ + public Boolean getAdministratorRequired() { + return administratorRequired; + } + + /** + * Get organization name + * @return Organization name + */ + public String getOrganizationName() { + return organizationName; + } + + /** + * Get organization URL + * @return Organization URL + */ + public String getOrganizationUrl() { + return organizationUrl; + } + + /** + * Get organization email + * @return Organization email + */ + public String getOrganizationEmail() { + return organizationEmail; + } + + /** + * Get bundle JRE + * @return Bundle JRE + */ + public Boolean getBundleJre() { + return bundleJre; + } + + /** + * Get customized JRE + * @return Customized JRE + */ + public Boolean getCustomizedJre() { + return customizedJre; + } + + /** + * Get JRE path + * @return JRE path + */ + public File getJrePath() { + return jrePath; + } + + /** + * Get JDK path + * @return JDK path + */ + public File getJdkPath() { + return jdkPath; + } + + /** + * Get JDK version + * @return JDK version + */ + public String getJdkVersion() { + return jdkVersion; + } + + /** + * Get JDK vendor + * @return JDK vendor + */ + public String getJdkVendor() { + return jdkVendor; + } + + /** + * Get additional resourcxes + * @return Additional resources + */ + public List getAdditionalResources() { + return additionalResources; + } + + /** + * Get Modules + * @return Modules + */ + public List getModules() { + return modules; + } + + /** + * Get additional modules + * @return Additional modules + */ + public List getAdditionalModules() { + return additionalModules; + } + + /** + * Get platform + * @return Platform + */ + public Platform getPlatform() { + return platform; + } + + /** + * Get env path + * @return Env path + */ + public String getEnvPath() { + return envPath; + } + + /** + * Get VM args + * @return VM args + */ + public List getVmArgs() { + return vmArgs; + } + + /** + * Get runnable JAR + * @return Runnable JAR + */ + public File getRunnableJar() { + return runnableJar; + } + + /** + * Get copy dependencies + * @return Copy dependencies + */ + public Boolean getCopyDependencies() { + return copyDependencies; + } + + /** + * Get JRE directory name + * @return JRE directory name + */ + public String getJreDirectoryName() { + return jreDirectoryName; + } + + /** + * Get Windows config + * @return Windows config + */ + public WindowsConfig getWinConfig() { + return winConfig; + } + + /** + * Get Linux config + * @return Linux config + */ + public LinuxConfig getLinuxConfig() { + return linuxConfig; + } + + /** + * Get Mac OS config + * @return Mac OS config + */ + public MacConfig getMacConfig() { + return macConfig; + } + + /** + * Get create tarball + * @return Create tarball + */ + public Boolean getCreateTarball() { + return createTarball; + } + + /** + * Get create zipball + * @return Create zipball + */ + public Boolean getCreateZipball() { + return createZipball; + } + + /** + * Get extra parameters + * @return Extra parameters + */ + public Map getExtra() { + return extra; + } + + /** + * Get if it has to use resources folder as working directory + * @return Use resources folder as working directory + */ + public boolean isUseResourcesAsWorkingDir() { + return useResourcesAsWorkingDir; + } + + /** + * Get assets dir + * @return Assets dir + */ + public File getAssetsDir() { + return assetsDir; + } + + /** + * Get classpath + * @return Classpath + */ + public String getClasspath() { + return classpath; + } + + /** + * Get JRE min version + * @return JRE min version + */ + public String getJreMinVersion() { + return jreMinVersion; + } + + /** + * Get Manifest + * @return manifest + */ + public Manifest getManifest() { + return manifest; + } + + /** + * Get additional modules paths + * @return Additional module paths + */ + public List getAdditionalModulePaths() { + return additionalModulePaths; + } + + /** + * Get file associations + * @return File associations + */ + public List getFileAssociations() { + return fileAssociations; + } + + /** + * Get scripts + * @return Scripts + */ + public Scripts getScripts() { + return scripts; + } + + // fluent api + + /** + * Set output directory + * @param outputDirectory Output directory + * @return Packager settings + */ + public PackageTask outputDirectory(File outputDirectory) { + this.outputDirectory = outputDirectory; + return this; + } + + /** + * Set packaging JDK + * @param packagingJdk Packaging JDK + * @return Packager settings + */ + public PackageTask packagingJdk(File packagingJdk) { + this.packagingJdk = packagingJdk; + return this; + } + + /** + * Set license file + * @param licenseFile License file + * @return Packager settings + */ + public PackageTask licenseFile(File licenseFile) { + this.licenseFile = licenseFile; + return this; + } + + /** + * Set icon file + * @param iconFile Icon file + * @return Packager settings + */ + public PackageTask iconFile(File iconFile) { + this.iconFile = iconFile; + return this; + } + + /** + * Set generate installer + * @param generateInstaller Generate installer + * @return Packager settings + */ + public PackageTask generateInstaller(Boolean generateInstaller) { + this.generateInstaller = generateInstaller; + return this; + } + + /** + * Set force installer + * @param forceInstaller Force installer + * @return Packager settings + */ + public PackageTask forceInstaller(Boolean forceInstaller) { + this.forceInstaller = forceInstaller; + return this; + } + + /** + * Set main class + * @param mainClass Main class + * @return Packager settings + */ + public PackageTask mainClass(String mainClass) { + this.mainClass = mainClass; + return this; + } + + /** + * Set name + * @param name Name + * @return Packager settings + */ + public PackageTask name(String name) { + this.name = name; + return this; + } + + /** + * Set display name + * @param displayName Display name + * @return Packager settings + */ + public PackageTask displayName(String displayName) { + this.displayName = displayName; + return this; + } + + /** + * Set version + * @param version Version + * @return Packager settings + */ + public PackageTask version(String version) { + this.version = version; + return this; + } + + /** + * Set description + * @param description Description + * @return Packager settings + */ + public PackageTask description(String description) { + this.description = description; + return this; + } + + /** + * Set URL + * @param url URL + * @return Packager settings + */ + public PackageTask url(String url) { + this.url = url; + return this; + } + + /** + * Set administrator required + * @param administratorRequired Administrator required + * @return Packager settings + */ + public PackageTask administratorRequired(Boolean administratorRequired) { + this.administratorRequired = administratorRequired; + return this; + } + + /** + * Set organizstion name + * @param organizationName Organization name + * @return Packager settings + */ + public PackageTask organizationName(String organizationName) { + this.organizationName = organizationName; + return this; + } + + /** + * Set organization URL + * @param organizationUrl Organization URL + * @return Packager settings + */ + public PackageTask organizationUrl(String organizationUrl) { + this.organizationUrl = organizationUrl; + return this; + } + + /** + * Set organization email + * @param organizationEmail + * @return Packager settings + */ + public PackageTask organizationEmail(String organizationEmail) { + this.organizationEmail = organizationEmail; + return this; + } + + /** + * Set bundle JRE + * @param bundleJre Bundle JRE + * @return Packager settings + */ + public PackageTask bundleJre(Boolean bundleJre) { + this.bundleJre = bundleJre; + return this; + } + + /** + * Set customized JRE + * @param customizedJre Customized JRE + * @return Packager settings + */ + public PackageTask customizedJre(Boolean customizedJre) { + this.customizedJre = customizedJre; + return this; + } + + /** + * Set JRE path + * @param jrePath JRE path + * @return Packager settings + */ + public PackageTask jrePath(File jrePath) { + this.jrePath = jrePath; + return this; + } + + /** + * Set JDK path + * @param jdkPath JDK path + * @return Packager settings + */ + public PackageTask jdkPath(File jdkPath) { + this.jdkPath = jdkPath; + return this; + } + + /** + * Set JDK version + * @param jdkVersion JDK version + * @return Packager settings + */ + public PackageTask jdkVersion(String jdkVersion) { + this.jdkVersion = jdkVersion; + return this; + } + + /** + * Set JDK vendor + * @param jdkVendor JDK vendor + * @return Packager settings + */ + public PackageTask jdkVendor(String jdkVendor) { + this.jdkVendor = jdkVendor; + return this; + } + + /** + * Set additional resources list + * @param additionalResources Additional resources list + * @return Packager settings + */ + public PackageTask additionalResources(List additionalResources) { + this.additionalResources = new ArrayList<>(additionalResources); + return this; + } + + /** + * Set modules list + * @param modules Modules list + * @return Packager settings + */ + public PackageTask modules(List modules) { + this.modules = new ArrayList<>(modules); + return this; + } + + /** + * Set additional modules list + * @param additionalModules Additional modules list + * @return Packager settings + */ + public PackageTask additionalModules(List additionalModules) { + this.additionalModules = new ArrayList<>(additionalModules); + return this; + } + + /** + * Set platform + * @param platform Platform + * @return Packager settings + */ + public PackageTask platform(Platform platform) { + this.platform = platform; + return this; + } + + /** + * Set ENV path + * @param envPath ENV path + * @return Packager settings + */ + public PackageTask envPath(String envPath) { + this.envPath = envPath; + return this; + } + + /** + * Set VM arguments + * @param vmArgs VM arguments + * @return Packager settings + */ + public PackageTask vmArgs(List vmArgs) { + this.vmArgs = new ArrayList<>(vmArgs); + return this; + } + + /** + * Set runnable JAR + * @param runnableJar Runnable JAR + * @return Packager settings + */ + public PackageTask runnableJar(File runnableJar) { + this.runnableJar = runnableJar; + return this; + } + + /** + * Set copy dependencies + * @param copyDependencies Copy dependencies + * @return Packager settings + */ + public PackageTask copyDependencies(Boolean copyDependencies) { + this.copyDependencies = copyDependencies; + return this; + } + + /** + * Set JRE directory name + * @param jreDirectoryName JRE directory name + * @return Packager settings + */ + public PackageTask jreDirectoryName(String jreDirectoryName) { + this.jreDirectoryName = jreDirectoryName; + return this; + } + + /** + * Set Windows specific configuration + * @param winConfig Windows specific configuration + * @return Packager settings + */ + public PackageTask winConfig(WindowsConfig winConfig) { + this.winConfig = winConfig; + return this; + } + + /** + * Set GNU/Linux specific configuration + * @param linuxConfig GNU/Linux specific configuration + * @return Packager settings + */ + public PackageTask linuxConfig(LinuxConfig linuxConfig) { + this.linuxConfig = linuxConfig; + return this; + } + + /** + * Set Mac OS specific configuration + * @param macConfig Mac OS specific configuration + * @return Packager settings + */ + public PackageTask macConfig(MacConfig macConfig) { + this.macConfig = macConfig; + return this; + } + + /** + * Set create tarball + * @param createTarball Create tarball + * @return Packager settings + */ + public PackageTask createTarball(Boolean createTarball) { + this.createTarball = createTarball; + return this; + } + + /** + * Set create zipball + * @param createZipball Create zipball + * @return Packager settings + */ + public PackageTask createZipball(Boolean createZipball) { + this.createZipball = createZipball; + return this; + } + + /** + * Set extra parameters map + * @param extra Extra parameters map + * @return Packager settings + */ + public PackageTask extra(Map extra) { + this.extra = extra; + return this; + } + + /** + * Set if it use resources folder as working directory + * @param useResourcesAsWorkingDir Use resources folder as working directory + * @return Packager settings + */ + public PackageTask useResourcesAsWorkingDir(boolean useResourcesAsWorkingDir) { + this.useResourcesAsWorkingDir = useResourcesAsWorkingDir; + return this; + } + + /** + * Set asstes directory + * @param assetsDir Assets directory + * @return Packager settings + */ + public PackageTask assetsDir(File assetsDir) { + this.assetsDir = assetsDir; + return this; + } + + /** + * Set classpath + * @param classpath Classpath + * @return Packager settings + */ + public PackageTask classpath(String classpath) { + this.classpath = classpath; + return this; + } + + /** + * Set minimal JRE version + * @param jreMinVersion JRE minimal version + * @return Packager settings + */ + public PackageTask jreMinVersion(String jreMinVersion) { + this.jreMinVersion = jreMinVersion; + return this; + } + + /** + * Set Manifest configuration + * @param manifest Manifest + * @return Packager settings + */ + public PackageTask manifest(Manifest manifest) { + this.manifest = manifest; + return this; + } + + /** + * Set additional module paths + * @param additionalModulePaths Additional module path list + * @return Packager settings + */ + public PackageTask additionalModulePaths(List additionalModulePaths) { + this.additionalModulePaths = additionalModulePaths; + return this; + } + + /** + * Set file associations + * @param fileAssociations File associations list + * @return Packager settings + */ + public PackageTask fileAssociations(List fileAssociations) { + this.fileAssociations = fileAssociations; + return this; + } + + /** + * Set scripts + * @param scripts Scripts + * @return Packager settings + */ + public PackageTask scripts(Scripts scripts) { + this.scripts = scripts; + return this; + } + + // some helpful methods + + /** + * Checks if there are file associations specified + * @return true if there are file asociations, otherwise false + */ + public boolean isThereFileAssociations() { + return fileAssociations != null && !fileAssociations.isEmpty(); + } + + /** + * Mime types list to string + * @param separator Character used to join mime types into one string + * @return Mime type list string + */ + public String getMimeTypesListAsString(String separator) { + return StringUtils.join(fileAssociations.stream().map(fa -> fa.getMimeType()).collect(Collectors.toList()), + separator); + } + + @Override + public String toString() { + return "PackageTask [outputDirectory=" + outputDirectory + ", licenseFile=" + licenseFile + ", iconFile=" + + iconFile + ", generateInstaller=" + generateInstaller + ", forceInstaller=" + forceInstaller + + ", mainClass=" + mainClass + ", name=" + name + ", displayName=" + displayName + ", version=" + + version + ", description=" + description + ", url=" + url + ", administratorRequired=" + + administratorRequired + ", organizationName=" + organizationName + ", organizationUrl=" + + organizationUrl + ", organizationEmail=" + organizationEmail + ", bundleJre=" + bundleJre + + ", customizedJre=" + customizedJre + ", jrePath=" + jrePath + ", jdkPath=" + jdkPath + + ", additionalResources=" + additionalResources + ", modules=" + modules + ", additionalModules=" + + additionalModules + ", platform=" + platform + ", envPath=" + envPath + ", vmArgs=" + vmArgs + + ", runnableJar=" + runnableJar + ", copyDependencies=" + copyDependencies + ", jreDirectoryName=" + + jreDirectoryName + ", winConfig=" + winConfig + ", linuxConfig=" + linuxConfig + ", macConfig=" + + macConfig + ", createTarball=" + createTarball + ", createZipball=" + createZipball + ", extra=" + + extra + ", useResourcesAsWorkingDir=" + useResourcesAsWorkingDir + ", assetsDir=" + assetsDir + + ", classpath=" + classpath + ", jreMinVersion=" + jreMinVersion + ", manifest=" + manifest + + ", additionalModulePaths=" + additionalModulePaths + ", fileAssociations=" + fileAssociations + + ", packagingJdk=" + packagingJdk + ", scripts=" + scripts + "]"; + } +} \ No newline at end of file diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/AbstractPackageTask.java b/src/main/java/io/github/fvarrui/javapackager/gradle/AbstractPackageTask.java deleted file mode 100644 index 5cf1bc8a..00000000 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/AbstractPackageTask.java +++ /dev/null @@ -1,64 +0,0 @@ -package io.github.fvarrui.javapackager.gradle; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import org.gradle.api.DefaultTask; -import org.gradle.api.tasks.OutputFiles; -import org.gradle.api.tasks.TaskAction; - -import io.github.fvarrui.javapackager.packagers.Packager; - -/** - * Abstract packaging task for Gradle - */ -public abstract class AbstractPackageTask extends DefaultTask { - - private List outputFiles; - - @OutputFiles - public List getOutputFiles() { - return outputFiles != null ? outputFiles : new ArrayList<>(); - } - - /** - * Task constructor - */ - public AbstractPackageTask() { - super(); - setGroup(PackagePlugin.GROUP_NAME); - setDescription("Packages the application as a native Windows, Mac OS X or GNU/Linux executable and creates an installer"); - getOutputs().upToDateWhen(o -> false); - } - - /** - * Packaging task action - * @throws Exception Throwed if something went wrong - */ - @TaskAction - public void doPackage() throws Exception { - - Packager packager = createPackager(); - - // generates app, installers and bundles - File app = packager.createApp(); - List installers = packager.generateInstallers(); - List bundles = packager.createBundles(); - - // sets generated files as output - outputFiles = new ArrayList<>(); - outputFiles.add(app); - outputFiles.addAll(installers); - outputFiles.addAll(bundles); - - } - - /** - * Creates a platform specific packager - * @return Packager - * @throws Exception Throwed if something went wrong - */ - protected abstract Packager createPackager() throws Exception; - -} diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/DefaultPackageTask.java b/src/main/java/io/github/fvarrui/javapackager/gradle/DefaultPackageTask.java deleted file mode 100644 index b4195a35..00000000 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/DefaultPackageTask.java +++ /dev/null @@ -1,67 +0,0 @@ -package io.github.fvarrui.javapackager.gradle; - -import static io.github.fvarrui.javapackager.utils.ObjectUtils.defaultIfNull; - -import io.github.fvarrui.javapackager.packagers.Packager; -import io.github.fvarrui.javapackager.packagers.PackagerFactory; - -/** - * Default packaging task for Gradle - */ -public class DefaultPackageTask extends AbstractPackageTask { - - @Override - protected Packager createPackager() throws Exception { - - PackagePluginExtension extension = getProject().getExtensions().findByType(PackagePluginExtension.class); - - return - (Packager) PackagerFactory - .createPackager(extension.getPlatform()) - .additionalModules(extension.getAdditionalModules()) - .additionalModulePaths(extension.getAdditionalModulePaths()) - .additionalResources(extension.getAdditionalResources()) - .administratorRequired(extension.getAdministratorRequired()) - .assetsDir(extension.getAssetsDir()) - .bundleJre(extension.getBundleJre()) - .classpath(extension.getClasspath()) - .copyDependencies(extension.getCopyDependencies()) - .createTarball(extension.getCreateTarball()) - .createZipball(extension.getCreateZipball()) - .customizedJre(extension.getCustomizedJre()) - .description(extension.getDescription()) - .displayName(extension.getDisplayName()) - .envPath(extension.getEnvPath()) - .extra(extension.getExtra()) - .fileAssociations(extension.getFileAssociations()) - .forceInstaller(extension.isForceInstaller()) - .generateInstaller(extension.getGenerateInstaller()) - .jdkPath(extension.getJdkPath()) - .jdkVersion(extension.getJdkVersion()) - .jdkVendor(extension.getJdkVendor()) - .jreDirectoryName(extension.getJreDirectoryName()) - .jreMinVersion(extension.getJreMinVersion()) - .jrePath(extension.getJrePath()) - .licenseFile(extension.getLicenseFile()) - .linuxConfig(extension.getLinuxConfig()) - .macConfig(extension.getMacConfig()) - .mainClass(extension.getMainClass()) - .manifest(extension.getManifest()) - .modules(extension.getModules()) - .name(extension.getName()) - .organizationEmail(extension.getOrganizationEmail()) - .organizationName(extension.getOrganizationName()) - .organizationUrl(extension.getOrganizationUrl()) - .outputDirectory(extension.getOutputDirectory()) - .packagingJdk(extension.getPackagingJdk()) - .runnableJar(extension.getRunnableJar()) - .scripts(extension.getScripts()) - .useResourcesAsWorkingDir(extension.isUseResourcesAsWorkingDir()) - .url(extension.getUrl()) - .version(defaultIfNull(extension.getVersion(), getProject().getVersion().toString())) - .vmArgs(extension.getVmArgs()) - .winConfig(extension.getWinConfig()); - - } - -} \ No newline at end of file diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePlugin.java b/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePlugin.java index acc47b3d..c9b2bc62 100644 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePlugin.java +++ b/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePlugin.java @@ -1,6 +1,7 @@ package io.github.fvarrui.javapackager.gradle; import edu.sc.seis.launch4j.tasks.Launch4jLibraryTask; +import io.github.fvarrui.javapackager.PackageTask; import io.github.fvarrui.javapackager.packagers.Context; import org.gradle.api.Plugin; import org.gradle.api.Project; @@ -24,8 +25,8 @@ public void apply(Project project) { project.getPluginManager().apply("java"); project.getPluginManager().apply("edu.sc.seis.launch4j"); - project.getExtensions().create(SETTINGS_EXT_NAME, PackagePluginExtension.class, project); - project.getTasks().create(PACKAGE_TASK_NAME, DefaultPackageTask.class).dependsOn("build"); + project.getExtensions().create(SETTINGS_EXT_NAME, PackageTask.class, project); + project.getTasks().create(PACKAGE_TASK_NAME, PackageTask.class).dependsOn("build"); Context.getGradleContext().setLibraryTask(project.getTasks().create("launch4j_" + UUID.randomUUID(), Launch4jLibraryTask.class)); diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePluginExtension.java b/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePluginExtension.java deleted file mode 100644 index 6d555fc9..00000000 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePluginExtension.java +++ /dev/null @@ -1,87 +0,0 @@ -package io.github.fvarrui.javapackager.gradle; - -import java.io.File; -import java.util.ArrayList; -import java.util.HashMap; - -import org.gradle.api.Project; - -import groovy.lang.Closure; -import io.github.fvarrui.javapackager.model.LinuxConfig; -import io.github.fvarrui.javapackager.model.MacConfig; -import io.github.fvarrui.javapackager.model.Manifest; -import io.github.fvarrui.javapackager.model.Platform; -import io.github.fvarrui.javapackager.model.Scripts; -import io.github.fvarrui.javapackager.model.WindowsConfig; -import io.github.fvarrui.javapackager.packagers.PackagerSettings; - -/** - * JavaPackager plugin extension for Gradle - */ -public class PackagePluginExtension extends PackagerSettings { - - private Project project; - - public PackagePluginExtension(Project project) { - super(); - this.project = project; - this.platform = Platform.auto; - this.additionalModules = new ArrayList<>(); - this.additionalModulePaths = new ArrayList<>(); - this.additionalResources = new ArrayList<>(); - this.administratorRequired = false; - this.assetsDir = new File(project.getProjectDir(), "assets"); - this.bundleJre = true; - this.copyDependencies = true; - this.createTarball = false; - this.createZipball = false; - this.customizedJre = true; - this.description = project.getDescription(); - this.extra = new HashMap<>(); - this.generateInstaller = true; - this.jreDirectoryName = "jre"; - this.linuxConfig = new LinuxConfig(); - this.macConfig = new MacConfig(); - this.manifest = new Manifest(); - this.modules = new ArrayList<>(); - this.name = project.getName(); - this.organizationEmail = ""; - this.useResourcesAsWorkingDir = true; - this.vmArgs = new ArrayList<>(); - this.winConfig = new WindowsConfig(); - this.outputDirectory = project.getBuildDir(); - this.scripts = new Scripts(); - this.forceInstaller = false; - } - - public LinuxConfig linuxConfig(Closure closure) { - linuxConfig = new LinuxConfig(); - project.configure(linuxConfig, closure); - return linuxConfig; - } - - public MacConfig macConfig(Closure closure) { - macConfig = new MacConfig(); - project.configure(macConfig, closure); - return macConfig; - } - - public WindowsConfig winConfig(Closure closure) { - winConfig = new WindowsConfig(); - project.configure(winConfig, closure); - return winConfig; - } - - public Manifest manifest(Closure closure) { - manifest = new Manifest(); - project.configure(manifest, closure); - return manifest; - } - - public Scripts scripts(Closure closure) { - scripts = new Scripts(); - project.configure(scripts, closure); - return scripts; - } - -} \ No newline at end of file diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/PackageTask.java b/src/main/java/io/github/fvarrui/javapackager/gradle/PackageTask.java deleted file mode 100644 index 124158a1..00000000 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/PackageTask.java +++ /dev/null @@ -1,646 +0,0 @@ -package io.github.fvarrui.javapackager.gradle; - -import static io.github.fvarrui.javapackager.utils.ObjectUtils.defaultIfBlank; -import static io.github.fvarrui.javapackager.utils.ObjectUtils.defaultIfNull; - -import java.io.File; -import java.util.List; -import java.util.Map; - -import org.gradle.api.tasks.Input; -import org.gradle.api.tasks.InputDirectory; -import org.gradle.api.tasks.InputFile; -import org.gradle.api.tasks.Optional; -import org.gradle.api.tasks.OutputDirectory; - -import groovy.lang.Closure; -import io.github.fvarrui.javapackager.model.FileAssociation; -import io.github.fvarrui.javapackager.model.LinuxConfig; -import io.github.fvarrui.javapackager.model.MacConfig; -import io.github.fvarrui.javapackager.model.Manifest; -import io.github.fvarrui.javapackager.model.Platform; -import io.github.fvarrui.javapackager.model.Scripts; -import io.github.fvarrui.javapackager.model.WindowsConfig; -import io.github.fvarrui.javapackager.packagers.Context; -import io.github.fvarrui.javapackager.packagers.Packager; -import io.github.fvarrui.javapackager.packagers.PackagerFactory; - -/** - * Packaging task fro Gradle - */ -public class PackageTask extends AbstractPackageTask { - - // =============== - // task parameters - // =============== - - @Input - @Optional - private Platform platform; - - public Platform getPlatform() { - return platform; - } - - public void setPlatform(Platform platform) { - this.platform = platform; - } - - @Input - @Optional - private List additionalModules; - - public List getAdditionalModules() { - return additionalModules; - } - - public void setAdditionalModules(List additionalModules) { - this.additionalModules = additionalModules; - } - - @Input - @Optional - private List additionalResources; - - public List getAdditionalResources() { - return additionalResources; - } - - public void setAdditionalResources(List additionalResources) { - this.additionalResources = additionalResources; - } - - @Input - @Optional - private Boolean administratorRequired; - - public Boolean isAdministratorRequired() { - return administratorRequired; - } - - public void setAdministratorRequired(Boolean administratorRequired) { - this.administratorRequired = administratorRequired; - } - - @InputDirectory - @Optional - private File assetsDir; - - public File getAssetsDir() { - return assetsDir; - } - - public void setAssetsDir(File assetsDir) { - this.assetsDir = assetsDir; - } - - @InputDirectory - @Optional - private File packagingJdk; - - public File getPackagingJdk() { - return packagingJdk; - } - - public void setPackagingJdk(File packagingJdk) { - this.packagingJdk = packagingJdk; - } - - @Input - @Optional - private Boolean bundleJre; - - public Boolean isBundleJre() { - return bundleJre; - } - - public void setBundleJre(Boolean bundleJre) { - this.bundleJre = bundleJre; - } - - @Input - @Optional - private Boolean copyDependencies; - - public Boolean isCopyDependencies() { - return copyDependencies; - } - - public void setCopyDependencies(Boolean copyDependencies) { - this.copyDependencies = copyDependencies; - } - - @Input - @Optional - private Boolean createTarball; - - public Boolean isCreateTarball() { - return createTarball; - } - - public void setCreateTarball(Boolean createTarball) { - this.createTarball = createTarball; - } - - @Input - @Optional - private Boolean createZipball; - - public Boolean isCreateZipball() { - return createZipball; - } - - public void setCreateZipball(Boolean createZipball) { - this.createZipball = createZipball; - } - - @Input - @Optional - private Boolean customizedJre; - - public Boolean isCustomizedJre() { - return customizedJre; - } - - public void setCustomizedJre(Boolean customizedJre) { - this.customizedJre = customizedJre; - } - - @Input - @Optional - private String appDescription; - - public String getAppDescription() { - return appDescription; - } - - public void setAppDescription(String appDescription) { - this.appDescription = appDescription; - } - - @Input - @Optional - private String displayName; - - public String getDisplayName() { - return displayName; - } - - public void setDisplayName(String displayName) { - this.displayName = displayName; - } - - @Input - @Optional - private String envPath; - - public String getEnvPath() { - return envPath; - } - - public void setEnvPath(String envPath) { - this.envPath = envPath; - } - - @Input - @Optional - private Map extra; - - public Map getExtra() { - return extra; - } - - public void setExtra(Map extra) { - this.extra = extra; - } - - @Input - @Optional - private Boolean generateInstaller; - - public Boolean isGenerateInstaller() { - return generateInstaller; - } - - public void setGenerateInstaller(Boolean generateInstaller) { - this.generateInstaller = generateInstaller; - } - - @Input - @Optional - private Boolean forceInstaller; - - public Boolean isForceInstaller() { - return forceInstaller; - } - - public void setForceInstaller(Boolean forceInstaller) { - this.forceInstaller = forceInstaller; - } - - @InputDirectory - @Optional - private File jdkPath; - - public File getJdkPath() { - return jdkPath; - } - - public void setJdkPath(File jdkPath) { - this.jdkPath = jdkPath; - } - - @InputDirectory - @Optional - private String jdkVersion; - - public String getJdkVersion() { - return jdkVersion; - } - - public void setJdkVersion(String jdkVersion) { - this.jdkVersion = jdkVersion; - } - - @InputDirectory - @Optional - private String jdkVendor; - - public String getJdkVendor() { - return jdkVendor; - } - - public void setJdkPath(String jdkVendor) { - this.jdkVendor = jdkVendor; - } - - @Input - @Optional - private String jreDirectoryName; - - public String getJreDirectoryName() { - return jreDirectoryName; - } - - public void setJreDirectoryName(String jreDirectoryName) { - this.jreDirectoryName = jreDirectoryName; - } - - @InputDirectory - @Optional - private File jrePath; - - public File getJrePath() { - return jrePath; - } - - public void setJrePath(File jrePath) { - this.jrePath = jrePath; - } - - @InputFile - @Optional - private File licenseFile; - - public File getLicenseFile() { - return licenseFile; - } - - public void setLicenseFile(File licenseFile) { - this.licenseFile = licenseFile; - } - - @Input - @Optional - private LinuxConfig linuxConfig; - - public LinuxConfig getLinuxConfig() { - return linuxConfig; - } - - public void setLinuxConfig(LinuxConfig linuxConfig) { - this.linuxConfig = linuxConfig; - } - - public LinuxConfig linuxConfig(Closure closure) { - linuxConfig = new LinuxConfig(); - getProject().configure(linuxConfig, closure); - return linuxConfig; - } - - @Input - @Optional - private MacConfig macConfig; - - public MacConfig getMacConfig() { - return macConfig; - } - - public void setMacConfig(MacConfig macConfig) { - this.macConfig = macConfig; - } - - public MacConfig macConfig(Closure closure) { - macConfig = new MacConfig(); - getProject().configure(macConfig, closure); - return macConfig; - } - - @Input - @Optional - private String mainClass; - - public String getMainClass() { - return mainClass; - } - - public void setMainClass(String mainClass) { - this.mainClass = mainClass; - } - - @Input - @Optional - private List modules; - - public List getModules() { - return modules; - } - - public void setModules(List modules) { - this.modules = modules; - } - - @Input - @Optional - private String appName; - - public String getAppName() { - return appName; - } - - public void setAppName(String appName) { - this.appName = appName; - } - - @Input - @Optional - private String organizationEmail; - - public String getOrganizationEmail() { - return organizationEmail; - } - - public void setOrganizationEmail(String organizationEmail) { - this.organizationEmail = organizationEmail; - } - - @Input - @Optional - private String organizationName; - - public String getOrganizationName() { - return organizationName; - } - - public void setOrganizationName(String organizationName) { - this.organizationName = organizationName; - } - - @Input - @Optional - private String organizationUrl; - - public String getOrganizationUrl() { - return organizationUrl; - } - - public void setOrganizationUrl(String organizationUrl) { - this.organizationUrl = organizationUrl; - } - - @InputFile - @Optional - private File runnableJar; - - public File getRunnableJar() { - return runnableJar; - } - - public void setRunnableJar(File runnableJar) { - this.runnableJar = runnableJar; - } - - @Input - @Optional - private Boolean useResourcesAsWorkingDir; - - public Boolean isUseResourcesAsWorkingDir() { - return useResourcesAsWorkingDir; - } - - public void setUseResourcesAsWorkingDir(Boolean useResourcesAsWorkingDir) { - this.useResourcesAsWorkingDir = useResourcesAsWorkingDir; - } - - @Input - @Optional - private String url; - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - @Input - @Optional - private List vmArgs; - - public List getVmArgs() { - return vmArgs; - } - - public void setVmArgs(List vmArgs) { - this.vmArgs = vmArgs; - } - - @Input - @Optional - private WindowsConfig winConfig; - - public WindowsConfig getWinConfig() { - return winConfig; - } - - public WindowsConfig winConfig(Closure closure) { - winConfig = new WindowsConfig(); - getProject().configure(winConfig, closure); - return winConfig; - } - - @Input - @Optional - private String version; - - public String getVersion() { - return version; - } - - public void setVersion(String version) { - this.version = version; - } - - @OutputDirectory - @Optional - private File outputDirectory; - - public File getOutputDirectory() { - return outputDirectory; - } - - public void setOutputDirectory(File outputDirectory) { - this.outputDirectory = outputDirectory; - } - - @Input - @Optional - private String classpath; - - public String getClasspath() { - return classpath; - } - - public void setClasspath(String classpath) { - this.classpath = classpath; - } - - @Input - @Optional - private String jreMinVersion; - - public String getJreMinVersion() { - return jreMinVersion; - } - - public void setJreMinVersion(String jreMinVersion) { - this.jreMinVersion = jreMinVersion; - } - - @Input - @Optional - private Manifest manifest; - - public Manifest getManifest() { - return manifest; - } - - public Manifest manifest(Closure closure) { - manifest = new Manifest(); - getProject().configure(manifest, closure); - return manifest; - } - - @Input - @Optional - private List additionalModulePaths; - - public List getAdditionalModulePaths() { - return additionalModulePaths; - } - - public void setAdditionalModulePaths(List additionalModulePaths) { - this.additionalModulePaths = additionalModulePaths; - } - - @Input - @Optional - private List fileAssociations; - - public List getFileAssociations() { - return fileAssociations; - } - - public void setFileAssociations(List fileAssociations) { - this.fileAssociations = fileAssociations; - } - - @Input - @Optional - private Scripts scripts; - - public Scripts getScripts() { - return scripts; - } - - public void setScripts(Scripts scripts) { - this.scripts = scripts; - } - - public Scripts scripts(Closure closure) { - scripts = new Scripts(); - getProject().configure(scripts, closure); - return scripts; - } - - // =============== - // create packager - // =============== - - @SuppressWarnings("unchecked") - @Override - protected Packager createPackager() throws Exception { - - PackagePluginExtension extension = getProject().getExtensions().findByType(PackagePluginExtension.class); - - return - (Packager) PackagerFactory - .createPackager(defaultIfNull(platform, extension.getPlatform())) - .additionalModules(defaultIfNull(additionalModules, extension.getAdditionalModules())) - .additionalModulePaths(defaultIfNull(additionalModulePaths, extension.getAdditionalModulePaths())) - .additionalResources(defaultIfNull(additionalResources, extension.getAdditionalResources())) - .administratorRequired(defaultIfNull(administratorRequired, extension.getAdministratorRequired())) - .assetsDir(defaultIfNull(assetsDir, extension.getAssetsDir())) - .bundleJre(defaultIfNull(bundleJre, extension.getBundleJre())) - .classpath(defaultIfNull(classpath, extension.getClasspath())) - .copyDependencies(defaultIfNull(copyDependencies, extension.getCopyDependencies())) - .createTarball(defaultIfNull(createTarball, extension.getCreateTarball())) - .createZipball(defaultIfNull(createZipball, extension.getCreateZipball())) - .customizedJre(defaultIfNull(customizedJre, extension.getCustomizedJre())) - .description(defaultIfNull(appDescription, extension.getDescription())) - .displayName(defaultIfNull(displayName, extension.getDisplayName())) - .envPath(defaultIfNull(envPath, extension.getEnvPath())) - .extra(defaultIfNull(extra, extension.getExtra())) - .fileAssociations(defaultIfNull(fileAssociations, extension.getFileAssociations())) - .forceInstaller(defaultIfNull(forceInstaller, extension.isForceInstaller())) - .generateInstaller(defaultIfNull(generateInstaller, extension.getGenerateInstaller())) - .jdkPath(defaultIfNull(jdkPath, extension.getJdkPath())) - .jdkVersion(defaultIfNull(jdkVersion, extension.getJdkVersion())) - .jdkVendor(defaultIfNull(jdkVendor, extension.getJdkVendor())) - .jreDirectoryName(defaultIfBlank(jreDirectoryName, extension.getJreDirectoryName())) - .jreMinVersion(defaultIfBlank(jreMinVersion, extension.getJreMinVersion())) - .jrePath(defaultIfNull(jrePath, extension.getJrePath())) - .licenseFile(defaultIfNull(licenseFile, extension.getLicenseFile())) - .linuxConfig(defaultIfNull(linuxConfig, extension.getLinuxConfig())) - .macConfig(defaultIfNull(macConfig, extension.getMacConfig())) - .mainClass(defaultIfNull(mainClass, extension.getMainClass())) - .manifest(defaultIfNull(manifest, extension.getManifest())) - .modules(defaultIfNull(modules, extension.getModules())) - .name(defaultIfNull(appName, extension.getName())) - .organizationEmail(defaultIfNull(organizationEmail, extension.getOrganizationEmail())) - .organizationName(defaultIfNull(organizationName, extension.getOrganizationName())) - .organizationUrl(defaultIfNull(organizationUrl, extension.getOrganizationUrl())) - .outputDirectory(defaultIfNull(outputDirectory, extension.getOutputDirectory())) - .packagingJdk(defaultIfNull(packagingJdk, extension.getPackagingJdk(), Context.getGradleContext().getDefaultToolchain())) - .runnableJar(defaultIfNull(runnableJar, extension.getRunnableJar())) - .scripts(defaultIfNull(scripts, extension.getScripts())) - .useResourcesAsWorkingDir(defaultIfNull(useResourcesAsWorkingDir, extension.isUseResourcesAsWorkingDir())) - .url(defaultIfNull(url, extension.getUrl())) - .version(defaultIfNull(version, extension.getVersion(), getProject().getVersion().toString())) - .vmArgs(defaultIfNull(vmArgs, extension.getVmArgs())) - .winConfig(defaultIfNull(winConfig, extension.getWinConfig())); - - } - -} \ No newline at end of file diff --git a/src/main/java/io/github/fvarrui/javapackager/ideas/MyGradleTask.java b/src/main/java/io/github/fvarrui/javapackager/ideas/MyGradleTask.java deleted file mode 100644 index 483e6e65..00000000 --- a/src/main/java/io/github/fvarrui/javapackager/ideas/MyGradleTask.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.github.fvarrui.javapackager.ideas; - -import io.github.fvarrui.javapackager.gradle.AbstractPackageTask; -import io.github.fvarrui.javapackager.packagers.Packager; - -public class MyGradleTask extends AbstractPackageTask implements MySettings{ - @Override - protected Packager createPackager() throws Exception { - return null; - } -} diff --git a/src/main/java/io/github/fvarrui/javapackager/ideas/MyMavenTask.java b/src/main/java/io/github/fvarrui/javapackager/ideas/MyMavenTask.java deleted file mode 100644 index ed223087..00000000 --- a/src/main/java/io/github/fvarrui/javapackager/ideas/MyMavenTask.java +++ /dev/null @@ -1,4 +0,0 @@ -package io.github.fvarrui.javapackager.ideas; - -public class MyMavenTask implements MySettings{ -} diff --git a/src/main/java/io/github/fvarrui/javapackager/ideas/MySettings.java b/src/main/java/io/github/fvarrui/javapackager/ideas/MySettings.java deleted file mode 100644 index eed44992..00000000 --- a/src/main/java/io/github/fvarrui/javapackager/ideas/MySettings.java +++ /dev/null @@ -1,14 +0,0 @@ -package io.github.fvarrui.javapackager.ideas; - -import org.apache.maven.plugins.annotations.Parameter; -import org.gradle.api.tasks.Input; -import org.gradle.api.tasks.Optional; - -public interface MySettings { - boolean IS_GRADLE = false; - - @Parameter(defaultValue = "${project.name}", property = "name", required = false) - @Input - @Optional - default String getName(){ return (IS_GRADLE ? "default-gradle-name" : "${project.name}");} -} diff --git a/src/main/java/io/github/fvarrui/javapackager/maven/PackageMojo.java b/src/main/java/io/github/fvarrui/javapackager/maven/PackageMojo.java deleted file mode 100644 index 8f452dd1..00000000 --- a/src/main/java/io/github/fvarrui/javapackager/maven/PackageMojo.java +++ /dev/null @@ -1,404 +0,0 @@ -package io.github.fvarrui.javapackager.maven; - -import static org.apache.commons.lang3.StringUtils.defaultIfBlank; -import static org.twdata.maven.mojoexecutor.MojoExecutor.executionEnvironment; - -import java.io.File; -import java.util.List; -import java.util.Map; - -import org.apache.maven.execution.MavenSession; -import org.apache.maven.plugin.AbstractMojo; -import org.apache.maven.plugin.BuildPluginManager; -import org.apache.maven.plugin.MojoExecutionException; -import org.apache.maven.plugins.annotations.Component; -import org.apache.maven.plugins.annotations.LifecyclePhase; -import org.apache.maven.plugins.annotations.Mojo; -import org.apache.maven.plugins.annotations.Parameter; -import org.apache.maven.plugins.annotations.ResolutionScope; -import org.apache.maven.project.MavenProject; - -import io.github.fvarrui.javapackager.model.FileAssociation; -import io.github.fvarrui.javapackager.model.LinuxConfig; -import io.github.fvarrui.javapackager.model.MacConfig; -import io.github.fvarrui.javapackager.model.Manifest; -import io.github.fvarrui.javapackager.model.Platform; -import io.github.fvarrui.javapackager.model.Scripts; -import io.github.fvarrui.javapackager.model.WindowsConfig; -import io.github.fvarrui.javapackager.packagers.Context; -import io.github.fvarrui.javapackager.packagers.Packager; -import io.github.fvarrui.javapackager.packagers.PackagerFactory; - -/** - * JavaPackager packaging mojo - */ -@Mojo(name = "package", defaultPhase = LifecyclePhase.PACKAGE, requiresDependencyResolution = ResolutionScope.RUNTIME) -public class PackageMojo extends AbstractMojo { - - // maven components - - @Parameter(defaultValue = "${project}", readonly = true) - private MavenProject mavenProject; - - @Parameter(defaultValue = "${session}", readonly = true) - private MavenSession mavenSession; - - @Component - private BuildPluginManager pluginManager; - - // plugin parameters - - /** - * Output directory. - */ - @Parameter(defaultValue = "${project.build.directory}", property = "outputDirectory", required = false) - private File outputDirectory; - - /** - * Path to project license file. - */ - @Parameter(property = "licenseFile", required = false) - private File licenseFile; - - /** - * Path to the app icon file (PNG, ICO or ICNS). - */ - @Parameter(property = "iconFile", required = false) - private File iconFile; - - /** - * Generates an installer for the app. - */ - @Parameter(defaultValue = "true", property = "generateInstaller", required = false) - private Boolean generateInstaller; - - /** - * Forces installer generation. - */ - @Parameter(defaultValue = "false", property = "forceInstaller", required = false) - private Boolean forceInstaller; - - /** - * Full path to your app main class. - */ - @Parameter(defaultValue = "${exec.mainClass}", property = "mainClass", required = true) - private String mainClass; - - /** - * App name. - */ - @Parameter(defaultValue = "${project.name}", property = "name", required = false) - private String name; - - /** - * App name to show. - */ - @Parameter(defaultValue = "${project.name}", property = "displayName", required = false) - private String displayName; - - /** - * Project version. - */ - @Parameter(defaultValue = "${project.version}", property = "version", required = false) - private String version; - - /** - * Project description. - */ - @Parameter(defaultValue = "${project.description}", property = "description", required = false) - private String description; - - /** - * App website URL. - */ - @Parameter(defaultValue = "${project.url}", property = "url", required = false) - private String url; - - /** - * App will run as administrator (with elevated privileges). - */ - @Parameter(defaultValue = "false", property = "administratorRequired", required = false) - private Boolean administratorRequired; - - /** - * Organization name. - */ - @Parameter(defaultValue = "${project.organization.name}", property = "organizationName", required = false) - private String organizationName; - - /** - * Organization website URL. - */ - @Parameter(defaultValue = "${project.organization.url}", property = "organizationUrl", required = false) - private String organizationUrl; - - /** - * Organization email. - */ - @Parameter(defaultValue = "", property = "organizationEmail", required = false) - private String organizationEmail; - - /** - * Embeds a customized JRE with the app. - */ - @Parameter(defaultValue = "false", property = "bundleJre", required = false) - private Boolean bundleJre; - - /** - * Generates a customized JRE, including only identified or specified modules. Otherwise, all modules will be included. - */ - @Parameter(defaultValue = "true", property = "customizedJre", required = false) - private Boolean customizedJre; - - /** - * Path to JRE folder. If specified, it will bundle this JRE with the app, and won't generate a customized JRE. For Java 8 version or least. - */ - @Parameter(property = "jrePath", required = false) - private File jrePath; - - /** - * Path to JDK folder. If specified, it will use this JDK modules to generate a customized JRE. Allows generating JREs for different platforms. - */ - @Parameter(property = "jdkPath", required = false) - private File jdkPath; - - /** - * The JDK version. Supported versions differ from vendor to vendor, thus its recommended checking the vendors' website first before doing any changes. - */ - @Parameter(defaultValue = "8", property = "jdkVersion", required = false) - private String jdkVersion; - - /** - * The JDK vendor. - */ - @Parameter(defaultValue = "adoptium", property = "jdkVendor", required = false) - private String jdkVendor; - - /** - * Additional files and folders to include in the bundled app. - */ - @Parameter(property = "additionalResources", required = false) - private List additionalResources; - - /** - * Defines modules to customize the bundled JRE. Don't use jdeps to get module dependencies. - */ - @Parameter(property = "modules", required = false) - private List modules; - - /** - * Additional modules to the ones identified by jdeps or the specified with modules property. - */ - @Parameter(property = "additionalModules", required = false) - private List additionalModules; - - /** - * Which platform to build, one of: - *
    - *
  • auto - automatically detect based on the host OS (the default)
  • - *
  • mac
  • - *
  • linux
  • - *
  • windows
  • - *
- * To build for multiple platforms at once, add multiple executions to the plugin's configuration. - */ - @Parameter(defaultValue = "auto", property = "platform", required = true) - private Platform platform; - - /** - * Defines PATH environment variable in GNU/Linux and Mac OS X startup scripts. - */ - @Parameter(property = "envPath", required = false) - private String envPath; - - /** - * Additional arguments to provide to the JVM (for example -Xmx2G). - */ - @Parameter(property = "vmArgs", required = false) - private List vmArgs; - - /** - * Provide your own runnable .jar (for example, a shaded .jar) instead of letting this plugin create one via - * the maven-jar-plugin. - */ - @Parameter(property = "runnableJar", required = false) - private File runnableJar; - - /** - * Whether or not to copy dependencies into the bundle. Generally, you will only disable this if you specified - * a runnableJar with all dependencies shaded into the .jar itself. - */ - @Parameter(defaultValue = "true", property = "copyDependencies", required = true) - private Boolean copyDependencies; - - /** - * Bundled JRE directory name - */ - @Parameter(defaultValue = "jre", property = "jreDirectoryName", required = false) - private String jreDirectoryName; - - /** - * GNU/Linux specific config - */ - @Parameter(property = "linuxConfig", required = false) - private LinuxConfig linuxConfig; - - /** - * Mac OS X specific config - */ - @Parameter(property = "macConfig", required = false) - private MacConfig macConfig; - - /** - * Windows specific config - */ - @Parameter(property = "winConfig", required = false) - private WindowsConfig winConfig; - - /** - * Bundles app in a tarball file - */ - @Parameter(defaultValue = "false", property = "createTarball", required = false) - private Boolean createTarball; - - /** - * Bundles app in a zipball file - */ - @Parameter(defaultValue = "false", property = "createZipball", required = false) - private Boolean createZipball; - - /** - * Extra properties for customized Velocity templates, accesible through '$this.extra' map. - */ - @Parameter(required = false) - private Map extra; - - /** - * Uses app resources folder as default working directory. - */ - @Parameter(defaultValue = "true", property = "useResourcesAsWorkingDir", required = false) - private boolean useResourcesAsWorkingDir; - - /** - * Assets directory - */ - @Parameter(defaultValue = "${project.basedir}/assets", property = "assetsDir", required = false) - private File assetsDir; - - /** - * Classpath - */ - @Parameter(property = "classpath", required = false) - private String classpath; - - /** - * JRE min version - */ - @Parameter(property = "jreMinVersion", required = false) - private String jreMinVersion; - - /** - * Additional JAR manifest entries - */ - @Parameter(required = false) - private Manifest manifest; - - /** - * Additional module paths - */ - @Parameter(property = "additionalModulePaths", required = false) - private List additionalModulePaths; - - /** - * Packaging JDK - */ - @Parameter(defaultValue = "${java.home}", property = "packagingJdk", required = false) - private File packagingJdk; - - /** - * Additional module paths - */ - @Parameter(property = "fileAssociations", required = false) - private List fileAssociations; - - /** - * Scripts - */ - @Parameter(property = "scripts", required = false) - private Scripts scripts; - - public void execute() throws MojoExecutionException { - - Context.setContext( - new MavenContext( - executionEnvironment(mavenProject, mavenSession, pluginManager), - getLog() - ) - ); - - try { - - Packager packager = - (Packager) PackagerFactory - .createPackager(platform) - .additionalModules(additionalModules) - .additionalModulePaths(additionalModulePaths) - .additionalResources(additionalResources) - .administratorRequired(administratorRequired) - .assetsDir(assetsDir) - .bundleJre(bundleJre) - .classpath(classpath) - .copyDependencies(copyDependencies) - .createTarball(createTarball) - .createZipball(createZipball) - .customizedJre(customizedJre) - .description(description) - .displayName(displayName) - .envPath(envPath) - .extra(extra) - .fileAssociations(fileAssociations) - .forceInstaller(forceInstaller) - .generateInstaller(generateInstaller) - .iconFile(iconFile) - .jdkPath(jdkPath) - .jdkVersion(jdkVersion) - .jdkVendor(jdkVendor) - .jreDirectoryName(jreDirectoryName) - .jreMinVersion(jreMinVersion) - .jrePath(jrePath) - .licenseFile(licenseFile) - .linuxConfig(linuxConfig) - .macConfig(macConfig) - .mainClass(mainClass) - .manifest(manifest) - .modules(modules) - .name(defaultIfBlank(name, Context.getMavenContext().getEnv().getMavenProject().getArtifactId())) - .organizationEmail(organizationEmail) - .organizationName(organizationName) - .organizationUrl(organizationUrl) - .outputDirectory(outputDirectory) - .packagingJdk(packagingJdk) - .runnableJar(runnableJar) - .scripts(scripts) - .useResourcesAsWorkingDir(useResourcesAsWorkingDir) - .url(url) - .version(version) - .vmArgs(vmArgs) - .winConfig(winConfig); - - // generate app, installers and bundles - packager.createApp(); - packager.generateInstallers(); - packager.createBundles(); - - } catch (Exception e) { - - throw new MojoExecutionException(e.getMessage(), e); - - } - - - } - - -} diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/Packager.java b/src/main/java/io/github/fvarrui/javapackager/packagers/Packager.java index fb9326de..6bef3148 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/Packager.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/Packager.java @@ -10,6 +10,7 @@ import java.util.ArrayList; import java.util.List; +import io.github.fvarrui.javapackager.PackageTask; import io.github.fvarrui.javapackager.model.Platform; import io.github.fvarrui.javapackager.utils.FileUtils; import io.github.fvarrui.javapackager.utils.IconUtils; @@ -20,7 +21,7 @@ /** * Packager base class */ -public abstract class Packager extends PackagerSettings { +public abstract class Packager extends PackageTask { private static final String DEFAULT_ORGANIZATION_NAME = "ACME"; diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerFactory.java b/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerFactory.java deleted file mode 100644 index 14ae94b4..00000000 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerFactory.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.github.fvarrui.javapackager.packagers; - -import org.apache.commons.lang3.SystemUtils; - -import io.github.fvarrui.javapackager.model.Platform; - -/** - * Packager factory - */ -public class PackagerFactory { - - public static Packager createPackager(Platform platform) throws Exception { - if (platform == Platform.auto || platform == null) platform = Platform.getCurrentPlatform(); - Packager packager = null; - switch (platform) { - case mac: - packager = new MacPackager(); break; - case linux: - packager = new LinuxPackager(); break; - case windows: - packager = new WindowsPackager(); break; - default: - throw new Exception("Unsupported operating system: " + SystemUtils.OS_NAME + " " + SystemUtils.OS_VERSION + " " + SystemUtils.OS_ARCH); - } - packager.platform(platform); - return packager; - } - -} diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerSettings.java b/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerSettings.java deleted file mode 100644 index a0142795..00000000 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/PackagerSettings.java +++ /dev/null @@ -1,920 +0,0 @@ -package io.github.fvarrui.javapackager.packagers; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import org.apache.commons.lang3.StringUtils; - -import io.github.fvarrui.javapackager.model.FileAssociation; -import io.github.fvarrui.javapackager.model.LinuxConfig; -import io.github.fvarrui.javapackager.model.MacConfig; -import io.github.fvarrui.javapackager.model.Manifest; -import io.github.fvarrui.javapackager.model.Platform; -import io.github.fvarrui.javapackager.model.Scripts; -import io.github.fvarrui.javapackager.model.WindowsConfig; - -/** - * Common packagers' settings - */ -public class PackagerSettings { - - protected File outputDirectory; - protected File licenseFile; - protected File iconFile; - protected Boolean generateInstaller; - protected boolean forceInstaller; - protected String mainClass; - protected String name; - protected String displayName; - protected String version; - protected String description; - protected String url; - protected Boolean administratorRequired; - protected String organizationName; - protected String organizationUrl; - protected String organizationEmail; - protected Boolean bundleJre; - protected Boolean customizedJre; - protected File jrePath; - protected File jdkPath; - protected String jdkVersion; - protected String jdkVendor; - protected List additionalResources; - protected List modules; - protected List additionalModules; - protected Platform platform; - protected String envPath; - protected List vmArgs; - protected File runnableJar; - protected Boolean copyDependencies; - protected String jreDirectoryName; - protected WindowsConfig winConfig; - protected LinuxConfig linuxConfig; - protected MacConfig macConfig; - protected Boolean createTarball; - protected Boolean createZipball; - protected Map extra; - protected boolean useResourcesAsWorkingDir; - protected File assetsDir; - protected String classpath; - protected String jreMinVersion; - protected Manifest manifest; - protected List additionalModulePaths; - protected List fileAssociations; - protected File packagingJdk; - protected Scripts scripts; - - /** - * Get packaging JDK - * @return Packaging JDK - */ - public File getPackagingJdk() { - return packagingJdk; - } - - /** - * Get output directory - * @return Output directory - */ - public File getOutputDirectory() { - return outputDirectory; - } - - /** - * Get license file - * @return License file - */ - public File getLicenseFile() { - return licenseFile; - } - - /** - * Get icon file - * @return Icon file - */ - public File getIconFile() { - return iconFile; - } - - /** - * Get generate installer - * @return Generate installer - */ - public Boolean getGenerateInstaller() { - return generateInstaller; - } - - /** - * Get force installer - * @return Force installer - */ - public boolean isForceInstaller() { - return forceInstaller; - } - - /** - * Get main class - * @return Main class - */ - public String getMainClass() { - return mainClass; - } - - /** - * Get name - * @return Name - */ - public String getName() { - return name; - } - - /** - * Get display name - * @return Display name - */ - public String getDisplayName() { - return displayName; - } - - /** - * Get version - * @return Version - */ - public String getVersion() { - return version; - } - - /** - * Get description - * @return Description - */ - public String getDescription() { - return description; - } - - /** - * Get URL - * @return URL - */ - public String getUrl() { - return url; - } - - /** - * Get administrator required - * @return Administrator required - */ - public Boolean getAdministratorRequired() { - return administratorRequired; - } - - /** - * Get organization name - * @return Organization name - */ - public String getOrganizationName() { - return organizationName; - } - - /** - * Get organization URL - * @return Organization URL - */ - public String getOrganizationUrl() { - return organizationUrl; - } - - /** - * Get organization email - * @return Organization email - */ - public String getOrganizationEmail() { - return organizationEmail; - } - - /** - * Get bundle JRE - * @return Bundle JRE - */ - public Boolean getBundleJre() { - return bundleJre; - } - - /** - * Get customized JRE - * @return Customized JRE - */ - public Boolean getCustomizedJre() { - return customizedJre; - } - - /** - * Get JRE path - * @return JRE path - */ - public File getJrePath() { - return jrePath; - } - - /** - * Get JDK path - * @return JDK path - */ - public File getJdkPath() { - return jdkPath; - } - - /** - * Get JDK version - * @return JDK version - */ - public String getJdkVersion() { - return jdkVersion; - } - - /** - * Get JDK vendor - * @return JDK vendor - */ - public String getJdkVendor() { - return jdkVendor; - } - - /** - * Get additional resourcxes - * @return Additional resources - */ - public List getAdditionalResources() { - return additionalResources; - } - - /** - * Get Modules - * @return Modules - */ - public List getModules() { - return modules; - } - - /** - * Get additional modules - * @return Additional modules - */ - public List getAdditionalModules() { - return additionalModules; - } - - /** - * Get platform - * @return Platform - */ - public Platform getPlatform() { - return platform; - } - - /** - * Get env path - * @return Env path - */ - public String getEnvPath() { - return envPath; - } - - /** - * Get VM args - * @return VM args - */ - public List getVmArgs() { - return vmArgs; - } - - /** - * Get runnable JAR - * @return Runnable JAR - */ - public File getRunnableJar() { - return runnableJar; - } - - /** - * Get copy dependencies - * @return Copy dependencies - */ - public Boolean getCopyDependencies() { - return copyDependencies; - } - - /** - * Get JRE directory name - * @return JRE directory name - */ - public String getJreDirectoryName() { - return jreDirectoryName; - } - - /** - * Get Windows config - * @return Windows config - */ - public WindowsConfig getWinConfig() { - return winConfig; - } - - /** - * Get Linux config - * @return Linux config - */ - public LinuxConfig getLinuxConfig() { - return linuxConfig; - } - - /** - * Get Mac OS config - * @return Mac OS config - */ - public MacConfig getMacConfig() { - return macConfig; - } - - /** - * Get create tarball - * @return Create tarball - */ - public Boolean getCreateTarball() { - return createTarball; - } - - /** - * Get create zipball - * @return Create zipball - */ - public Boolean getCreateZipball() { - return createZipball; - } - - /** - * Get extra parameters - * @return Extra parameters - */ - public Map getExtra() { - return extra; - } - - /** - * Get if it has to use resources folder as working directory - * @return Use resources folder as working directory - */ - public boolean isUseResourcesAsWorkingDir() { - return useResourcesAsWorkingDir; - } - - /** - * Get assets dir - * @return Assets dir - */ - public File getAssetsDir() { - return assetsDir; - } - - /** - * Get classpath - * @return Classpath - */ - public String getClasspath() { - return classpath; - } - - /** - * Get JRE min version - * @return JRE min version - */ - public String getJreMinVersion() { - return jreMinVersion; - } - - /** - * Get Manifest - * @return manifest - */ - public Manifest getManifest() { - return manifest; - } - - /** - * Get additional modules paths - * @return Additional module paths - */ - public List getAdditionalModulePaths() { - return additionalModulePaths; - } - - /** - * Get file associations - * @return File associations - */ - public List getFileAssociations() { - return fileAssociations; - } - - /** - * Get scripts - * @return Scripts - */ - public Scripts getScripts() { - return scripts; - } - - // fluent api - - /** - * Set output directory - * @param outputDirectory Output directory - * @return Packager settings - */ - public PackagerSettings outputDirectory(File outputDirectory) { - this.outputDirectory = outputDirectory; - return this; - } - - /** - * Set packaging JDK - * @param packagingJdk Packaging JDK - * @return Packager settings - */ - public PackagerSettings packagingJdk(File packagingJdk) { - this.packagingJdk = packagingJdk; - return this; - } - - /** - * Set license file - * @param licenseFile License file - * @return Packager settings - */ - public PackagerSettings licenseFile(File licenseFile) { - this.licenseFile = licenseFile; - return this; - } - - /** - * Set icon file - * @param iconFile Icon file - * @return Packager settings - */ - public PackagerSettings iconFile(File iconFile) { - this.iconFile = iconFile; - return this; - } - - /** - * Set generate installer - * @param generateInstaller Generate installer - * @return Packager settings - */ - public PackagerSettings generateInstaller(Boolean generateInstaller) { - this.generateInstaller = generateInstaller; - return this; - } - - /** - * Set force installer - * @param forceInstaller Force installer - * @return Packager settings - */ - public PackagerSettings forceInstaller(Boolean forceInstaller) { - this.forceInstaller = forceInstaller; - return this; - } - - /** - * Set main class - * @param mainClass Main class - * @return Packager settings - */ - public PackagerSettings mainClass(String mainClass) { - this.mainClass = mainClass; - return this; - } - - /** - * Set name - * @param name Name - * @return Packager settings - */ - public PackagerSettings name(String name) { - this.name = name; - return this; - } - - /** - * Set display name - * @param displayName Display name - * @return Packager settings - */ - public PackagerSettings displayName(String displayName) { - this.displayName = displayName; - return this; - } - - /** - * Set version - * @param version Version - * @return Packager settings - */ - public PackagerSettings version(String version) { - this.version = version; - return this; - } - - /** - * Set description - * @param description Description - * @return Packager settings - */ - public PackagerSettings description(String description) { - this.description = description; - return this; - } - - /** - * Set URL - * @param url URL - * @return Packager settings - */ - public PackagerSettings url(String url) { - this.url = url; - return this; - } - - /** - * Set administrator required - * @param administratorRequired Administrator required - * @return Packager settings - */ - public PackagerSettings administratorRequired(Boolean administratorRequired) { - this.administratorRequired = administratorRequired; - return this; - } - - /** - * Set organizstion name - * @param organizationName Organization name - * @return Packager settings - */ - public PackagerSettings organizationName(String organizationName) { - this.organizationName = organizationName; - return this; - } - - /** - * Set organization URL - * @param organizationUrl Organization URL - * @return Packager settings - */ - public PackagerSettings organizationUrl(String organizationUrl) { - this.organizationUrl = organizationUrl; - return this; - } - - /** - * Set organization email - * @param organizationEmail - * @return Packager settings - */ - public PackagerSettings organizationEmail(String organizationEmail) { - this.organizationEmail = organizationEmail; - return this; - } - - /** - * Set bundle JRE - * @param bundleJre Bundle JRE - * @return Packager settings - */ - public PackagerSettings bundleJre(Boolean bundleJre) { - this.bundleJre = bundleJre; - return this; - } - - /** - * Set customized JRE - * @param customizedJre Customized JRE - * @return Packager settings - */ - public PackagerSettings customizedJre(Boolean customizedJre) { - this.customizedJre = customizedJre; - return this; - } - - /** - * Set JRE path - * @param jrePath JRE path - * @return Packager settings - */ - public PackagerSettings jrePath(File jrePath) { - this.jrePath = jrePath; - return this; - } - - /** - * Set JDK path - * @param jdkPath JDK path - * @return Packager settings - */ - public PackagerSettings jdkPath(File jdkPath) { - this.jdkPath = jdkPath; - return this; - } - - /** - * Set JDK version - * @param jdkVersion JDK version - * @return Packager settings - */ - public PackagerSettings jdkVersion(String jdkVersion) { - this.jdkVersion = jdkVersion; - return this; - } - - /** - * Set JDK vendor - * @param jdkVendor JDK vendor - * @return Packager settings - */ - public PackagerSettings jdkVendor(String jdkVendor) { - this.jdkVendor = jdkVendor; - return this; - } - - /** - * Set additional resources list - * @param additionalResources Additional resources list - * @return Packager settings - */ - public PackagerSettings additionalResources(List additionalResources) { - this.additionalResources = new ArrayList<>(additionalResources); - return this; - } - - /** - * Set modules list - * @param modules Modules list - * @return Packager settings - */ - public PackagerSettings modules(List modules) { - this.modules = new ArrayList<>(modules); - return this; - } - - /** - * Set additional modules list - * @param additionalModules Additional modules list - * @return Packager settings - */ - public PackagerSettings additionalModules(List additionalModules) { - this.additionalModules = new ArrayList<>(additionalModules); - return this; - } - - /** - * Set platform - * @param platform Platform - * @return Packager settings - */ - public PackagerSettings platform(Platform platform) { - this.platform = platform; - return this; - } - - /** - * Set ENV path - * @param envPath ENV path - * @return Packager settings - */ - public PackagerSettings envPath(String envPath) { - this.envPath = envPath; - return this; - } - - /** - * Set VM arguments - * @param vmArgs VM arguments - * @return Packager settings - */ - public PackagerSettings vmArgs(List vmArgs) { - this.vmArgs = new ArrayList<>(vmArgs); - return this; - } - - /** - * Set runnable JAR - * @param runnableJar Runnable JAR - * @return Packager settings - */ - public PackagerSettings runnableJar(File runnableJar) { - this.runnableJar = runnableJar; - return this; - } - - /** - * Set copy dependencies - * @param copyDependencies Copy dependencies - * @return Packager settings - */ - public PackagerSettings copyDependencies(Boolean copyDependencies) { - this.copyDependencies = copyDependencies; - return this; - } - - /** - * Set JRE directory name - * @param jreDirectoryName JRE directory name - * @return Packager settings - */ - public PackagerSettings jreDirectoryName(String jreDirectoryName) { - this.jreDirectoryName = jreDirectoryName; - return this; - } - - /** - * Set Windows specific configuration - * @param winConfig Windows specific configuration - * @return Packager settings - */ - public PackagerSettings winConfig(WindowsConfig winConfig) { - this.winConfig = winConfig; - return this; - } - - /** - * Set GNU/Linux specific configuration - * @param linuxConfig GNU/Linux specific configuration - * @return Packager settings - */ - public PackagerSettings linuxConfig(LinuxConfig linuxConfig) { - this.linuxConfig = linuxConfig; - return this; - } - - /** - * Set Mac OS specific configuration - * @param macConfig Mac OS specific configuration - * @return Packager settings - */ - public PackagerSettings macConfig(MacConfig macConfig) { - this.macConfig = macConfig; - return this; - } - - /** - * Set create tarball - * @param createTarball Create tarball - * @return Packager settings - */ - public PackagerSettings createTarball(Boolean createTarball) { - this.createTarball = createTarball; - return this; - } - - /** - * Set create zipball - * @param createZipball Create zipball - * @return Packager settings - */ - public PackagerSettings createZipball(Boolean createZipball) { - this.createZipball = createZipball; - return this; - } - - /** - * Set extra parameters map - * @param extra Extra parameters map - * @return Packager settings - */ - public PackagerSettings extra(Map extra) { - this.extra = extra; - return this; - } - - /** - * Set if it use resources folder as working directory - * @param useResourcesAsWorkingDir Use resources folder as working directory - * @return Packager settings - */ - public PackagerSettings useResourcesAsWorkingDir(boolean useResourcesAsWorkingDir) { - this.useResourcesAsWorkingDir = useResourcesAsWorkingDir; - return this; - } - - /** - * Set asstes directory - * @param assetsDir Assets directory - * @return Packager settings - */ - public PackagerSettings assetsDir(File assetsDir) { - this.assetsDir = assetsDir; - return this; - } - - /** - * Set classpath - * @param classpath Classpath - * @return Packager settings - */ - public PackagerSettings classpath(String classpath) { - this.classpath = classpath; - return this; - } - - /** - * Set minimal JRE version - * @param jreMinVersion JRE minimal version - * @return Packager settings - */ - public PackagerSettings jreMinVersion(String jreMinVersion) { - this.jreMinVersion = jreMinVersion; - return this; - } - - /** - * Set Manifest configuration - * @param manifest Manifest - * @return Packager settings - */ - public PackagerSettings manifest(Manifest manifest) { - this.manifest = manifest; - return this; - } - - /** - * Set additional module paths - * @param additionalModulePaths Additional module path list - * @return Packager settings - */ - public PackagerSettings additionalModulePaths(List additionalModulePaths) { - this.additionalModulePaths = additionalModulePaths; - return this; - } - - /** - * Set file associations - * @param fileAssociations File associations list - * @return Packager settings - */ - public PackagerSettings fileAssociations(List fileAssociations) { - this.fileAssociations = fileAssociations; - return this; - } - - /** - * Set scripts - * @param scripts Scripts - * @return Packager settings - */ - public PackagerSettings scripts(Scripts scripts) { - this.scripts = scripts; - return this; - } - - // some helpful methods - - /** - * Checks if there are file associations specified - * @return true if there are file asociations, otherwise false - */ - public boolean isThereFileAssociations() { - return fileAssociations != null && !fileAssociations.isEmpty(); - } - - /** - * Mime types list to string - * @param separator Character used to join mime types into one string - * @return Mime type list string - */ - public String getMimeTypesListAsString(String separator) { - return StringUtils.join(fileAssociations.stream().map(fa -> fa.getMimeType()).collect(Collectors.toList()), - separator); - } - - @Override - public String toString() { - return "PackagerSettings [outputDirectory=" + outputDirectory + ", licenseFile=" + licenseFile + ", iconFile=" - + iconFile + ", generateInstaller=" + generateInstaller + ", forceInstaller=" + forceInstaller - + ", mainClass=" + mainClass + ", name=" + name + ", displayName=" + displayName + ", version=" - + version + ", description=" + description + ", url=" + url + ", administratorRequired=" - + administratorRequired + ", organizationName=" + organizationName + ", organizationUrl=" - + organizationUrl + ", organizationEmail=" + organizationEmail + ", bundleJre=" + bundleJre - + ", customizedJre=" + customizedJre + ", jrePath=" + jrePath + ", jdkPath=" + jdkPath - + ", additionalResources=" + additionalResources + ", modules=" + modules + ", additionalModules=" - + additionalModules + ", platform=" + platform + ", envPath=" + envPath + ", vmArgs=" + vmArgs - + ", runnableJar=" + runnableJar + ", copyDependencies=" + copyDependencies + ", jreDirectoryName=" - + jreDirectoryName + ", winConfig=" + winConfig + ", linuxConfig=" + linuxConfig + ", macConfig=" - + macConfig + ", createTarball=" + createTarball + ", createZipball=" + createZipball + ", extra=" - + extra + ", useResourcesAsWorkingDir=" + useResourcesAsWorkingDir + ", assetsDir=" + assetsDir - + ", classpath=" + classpath + ", jreMinVersion=" + jreMinVersion + ", manifest=" + manifest - + ", additionalModulePaths=" + additionalModulePaths + ", fileAssociations=" + fileAssociations - + ", packagingJdk=" + packagingJdk + ", scripts=" + scripts + "]"; - }} \ No newline at end of file diff --git a/test/hello-world-gradle/build.gradle b/test/hello-world-gradle/build.gradle index 4640f6bb..9bc1e1c6 100644 --- a/test/hello-world-gradle/build.gradle +++ b/test/hello-world-gradle/build.gradle @@ -66,6 +66,10 @@ task packageForWindows(type: PackageTask, dependsOn: build) { } } +taskMyTask(type: MyPackageTask, dependsOn: build){ + getName() { return "name" } +} + task packageForLinux(type: PackageTask, dependsOn: build) { description = 'Packages the application as a native GNU/Linux executable and bundles it in a tarball' platform = 'linux' From b15b1aae4adfdd6a6bf3b431b6c5f9b8e0a30ab2 Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Wed, 3 Aug 2022 22:01:07 +0200 Subject: [PATCH 27/74] fixed small booleans --- .../java/io/github/fvarrui/javapackager/PackageTask.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/github/fvarrui/javapackager/PackageTask.java b/src/main/java/io/github/fvarrui/javapackager/PackageTask.java index 5335eb8e..a55172c0 100644 --- a/src/main/java/io/github/fvarrui/javapackager/PackageTask.java +++ b/src/main/java/io/github/fvarrui/javapackager/PackageTask.java @@ -273,7 +273,7 @@ public Scripts scripts(Closure closure) { @Parameter(property = "forceInstaller") @Input @Optional - protected boolean forceInstaller; + protected Boolean forceInstaller; /** * Full path to your app main class. @@ -536,7 +536,7 @@ public Scripts scripts(Closure closure) { @Parameter(property = "useResourcesAsWorkingDir", required = false) @Input @Optional - protected boolean useResourcesAsWorkingDir; + protected Boolean useResourcesAsWorkingDir; /** * Assets directory @@ -645,7 +645,7 @@ public Boolean getGenerateInstaller() { * Get force installer * @return Force installer */ - public boolean isForceInstaller() { + public Boolean isForceInstaller() { return forceInstaller; } @@ -901,7 +901,7 @@ public Map getExtra() { * Get if it has to use resources folder as working directory * @return Use resources folder as working directory */ - public boolean isUseResourcesAsWorkingDir() { + public Boolean isUseResourcesAsWorkingDir() { return useResourcesAsWorkingDir; } From 59f3a225ac019398bc1660b2d0ec7b0e9019c298 Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Thu, 4 Aug 2022 14:18:46 +0200 Subject: [PATCH 28/74] gradle: updated Packagers --- build.gradle | 2 +- .../fvarrui/javapackager/PackageTask.java | 8 +- .../javapackager/gradle/CopyDependencies.java | 2 +- .../gradle/CreateRunnableJar.java | 10 +- .../javapackager/gradle/CreateTarball.java | 12 +- .../gradle/CreateWindowsExeLaunch4j.java | 14 +- .../javapackager/gradle/CreateZipball.java | 12 +- .../javapackager/gradle/GradleContext.java | 2 +- .../javapackager/maven/CopyDependencies.java | 2 +- .../javapackager/maven/CreateRunnableJar.java | 10 +- .../javapackager/maven/CreateTarball.java | 10 +- .../maven/CreateWindowsExeLaunch4j.java | 16 +-- .../javapackager/maven/CreateZipball.java | 10 +- .../javapackager/maven/MavenContext.java | 2 +- .../maven/ResolveLicenseFromPOM.java | 2 +- .../fvarrui/javapackager/model/MacConfig.java | 2 +- .../javapackager/model/WindowsConfig.java | 16 +-- .../packagers/AbstractCreateWindowsExe.java | 6 +- .../javapackager/packagers/BundleJre.java | 22 +-- .../packagers/CreateWindowsExeWhy.java | 12 +- .../packagers/CreateWindowsExeWinRun4j.java | 18 +-- .../packagers/GenerateAppImage.java | 12 +- .../javapackager/packagers/GenerateDeb.java | 12 +- .../javapackager/packagers/GenerateDmg.java | 16 +-- .../javapackager/packagers/GenerateMsi.java | 12 +- .../javapackager/packagers/GenerateMsm.java | 12 +- .../javapackager/packagers/GeneratePkg.java | 12 +- .../javapackager/packagers/GenerateRpm.java | 14 +- .../javapackager/packagers/GenerateSetup.java | 16 +-- .../javapackager/packagers/LinuxPackager.java | 27 ++-- .../javapackager/packagers/MacPackager.java | 39 +++--- .../javapackager/packagers/Packager.java | 132 +++++++++--------- .../packagers/WindowsArtifactGenerator.java | 22 +-- .../packagers/WindowsPackager.java | 25 ++-- .../javapackager/utils/updater/RealTest.java | 2 +- test/hello-world-gradle/build.gradle | 6 +- 36 files changed, 280 insertions(+), 269 deletions(-) diff --git a/build.gradle b/build.gradle index e39dab5e..77e4da16 100644 --- a/build.gradle +++ b/build.gradle @@ -87,7 +87,7 @@ test { } group = 'io.github.fvarrui' -version = '1.6.7' +version = '1.7.0' description = 'Hybrid Maven/Gradle plugin to package Java applications as native Windows, Mac OS X or GNU/Linux executables and create installers for them' sourceCompatibility = JavaVersion.VERSION_1_8 diff --git a/src/main/java/io/github/fvarrui/javapackager/PackageTask.java b/src/main/java/io/github/fvarrui/javapackager/PackageTask.java index a55172c0..c0bf2828 100644 --- a/src/main/java/io/github/fvarrui/javapackager/PackageTask.java +++ b/src/main/java/io/github/fvarrui/javapackager/PackageTask.java @@ -117,7 +117,6 @@ public List getOutputFiles() { public void doPackage() throws Exception { Packager packager = this.createPackager(); - new PackageTask(); // generates app, installers and bundles File app = packager.createApp(); List installers = packager.generateInstallers(); @@ -187,15 +186,14 @@ public Packager createPackager(){ Packager packager = null; switch (platform) { case mac: - packager = new MacPackager(); break; + packager = new MacPackager(this); break; case linux: - packager = new LinuxPackager(); break; + packager = new LinuxPackager(this); break; case windows: - packager = new WindowsPackager(); break; + packager = new WindowsPackager(this); break; default: throw new RuntimeException("Unsupported operating system: " + SystemUtils.OS_NAME + " " + SystemUtils.OS_VERSION + " " + SystemUtils.OS_ARCH); } - packager.platform(platform); return packager; } diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/CopyDependencies.java b/src/main/java/io/github/fvarrui/javapackager/gradle/CopyDependencies.java index a4f0e250..654377e2 100644 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/CopyDependencies.java +++ b/src/main/java/io/github/fvarrui/javapackager/gradle/CopyDependencies.java @@ -22,7 +22,7 @@ public CopyDependencies() { @Override public boolean skip(Packager packager) { - return !packager.getCopyDependencies(); + return !packager.task.getCopyDependencies(); } @Override diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/CreateRunnableJar.java b/src/main/java/io/github/fvarrui/javapackager/gradle/CreateRunnableJar.java index 46d93d55..f9a6182d 100644 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/CreateRunnableJar.java +++ b/src/main/java/io/github/fvarrui/javapackager/gradle/CreateRunnableJar.java @@ -28,13 +28,13 @@ public CreateRunnableJar() { protected File doApply(Packager packager) { String classifier = "runnable"; - String name = packager.getName(); - String version = packager.getVersion(); - String mainClass = packager.getMainClass(); - File outputDirectory = packager.getOutputDirectory(); + String name = packager.task.getName(); + String version = packager.task.getVersion(); + String mainClass = packager.task.getMainClass(); + File outputDirectory = packager.task.getOutputDirectory(); Project project = Context.getGradleContext().getProject(); File libsFolder = packager.getLibsFolder(); - Manifest manifest = packager.getManifest(); + Manifest manifest = packager.task.getManifest(); List dependencies = new ArrayList<>(); if (libsFolder != null && libsFolder.exists()) { diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/CreateTarball.java b/src/main/java/io/github/fvarrui/javapackager/gradle/CreateTarball.java index f2ce76f7..616f5833 100644 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/CreateTarball.java +++ b/src/main/java/io/github/fvarrui/javapackager/gradle/CreateTarball.java @@ -23,19 +23,19 @@ public CreateTarball() { @Override public boolean skip(Packager packager) { - return !packager.getCreateTarball(); + return !packager.task.getCreateTarball(); } @Override protected File doApply(Packager packager) throws Exception { - String name = packager.getName(); - String version = packager.getVersion(); - Platform platform = packager.getPlatform(); - File outputDirectory = packager.getOutputDirectory(); + String name = packager.task.getName(); + String version = packager.task.getVersion(); + Platform platform = packager.task.getPlatform(); + File outputDirectory = packager.task.getOutputDirectory(); File appFolder = packager.getAppFolder(); File executable = packager.getExecutable(); - String jreDirectoryName = packager.getJreDirectoryName(); + String jreDirectoryName = packager.task.getJreDirectoryName(); File tarFile = new File(outputDirectory, name + "-" + version + "-" + platform + ".tar.gz"); diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/CreateWindowsExeLaunch4j.java b/src/main/java/io/github/fvarrui/javapackager/gradle/CreateWindowsExeLaunch4j.java index 3ba3221f..3f6ab5fc 100644 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/CreateWindowsExeLaunch4j.java +++ b/src/main/java/io/github/fvarrui/javapackager/gradle/CreateWindowsExeLaunch4j.java @@ -25,14 +25,14 @@ public CreateWindowsExeLaunch4j() { @Override protected File doApply(WindowsPackager packager) throws Exception { - List vmArgs = packager.getVmArgs(); - WindowsConfig winConfig = packager.getWinConfig(); + List vmArgs = packager.task.getVmArgs(); + WindowsConfig winConfig = packager.task.getWinConfig(); File executable = packager.getExecutable(); - String mainClass = packager.getMainClass(); - boolean useResourcesAsWorkingDir = packager.isUseResourcesAsWorkingDir(); - boolean bundleJre = packager.getBundleJre(); - String jreDirectoryName = packager.getJreDirectoryName(); - String jreMinVersion = packager.getJreMinVersion(); + String mainClass = packager.task.getMainClass(); + boolean useResourcesAsWorkingDir = packager.task.isUseResourcesAsWorkingDir(); + boolean bundleJre = packager.task.getBundleJre(); + String jreDirectoryName = packager.task.getJreDirectoryName(); + String jreMinVersion = packager.task.getJreMinVersion(); File jarFile = packager.getJarFile(); File appFolder = packager.getAppFolder(); diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/CreateZipball.java b/src/main/java/io/github/fvarrui/javapackager/gradle/CreateZipball.java index 401c3025..97d5e4b7 100644 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/CreateZipball.java +++ b/src/main/java/io/github/fvarrui/javapackager/gradle/CreateZipball.java @@ -22,19 +22,19 @@ public CreateZipball() { @Override public boolean skip(Packager packager) { - return !packager.getCreateZipball(); + return !packager.task.getCreateZipball(); } @Override protected File doApply(Packager packager) throws Exception { - String name = packager.getName(); - String version = packager.getVersion(); - Platform platform = packager.getPlatform(); - File outputDirectory = packager.getOutputDirectory(); + String name = packager.task.getName(); + String version = packager.task.getVersion(); + Platform platform = packager.task.getPlatform(); + File outputDirectory = packager.task.getOutputDirectory(); File appFolder = packager.getAppFolder(); File executable = packager.getExecutable(); - String jreDirectoryName = packager.getJreDirectoryName(); + String jreDirectoryName = packager.task.getJreDirectoryName(); File zipFile = new File(outputDirectory, name + "-" + version + "-" + platform + ".zip"); diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/GradleContext.java b/src/main/java/io/github/fvarrui/javapackager/gradle/GradleContext.java index b83eea0e..d6a4fd9b 100644 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/GradleContext.java +++ b/src/main/java/io/github/fvarrui/javapackager/gradle/GradleContext.java @@ -111,7 +111,7 @@ private File getToolchain() { @Override public File createWindowsExe(WindowsPackager packager) throws Exception { AbstractCreateWindowsExe createWindowsExe; - switch (packager.getWinConfig().getExeCreationTool()) { + switch (packager.task.getWinConfig().getExeCreationTool()) { case launch4j: createWindowsExe = new CreateWindowsExeLaunch4j(); break; case winrun4j: createWindowsExe = new CreateWindowsExeWinRun4j(); break; case why: createWindowsExe = new CreateWindowsExeWhy(); break; diff --git a/src/main/java/io/github/fvarrui/javapackager/maven/CopyDependencies.java b/src/main/java/io/github/fvarrui/javapackager/maven/CopyDependencies.java index 1fc5be50..5c9174fe 100644 --- a/src/main/java/io/github/fvarrui/javapackager/maven/CopyDependencies.java +++ b/src/main/java/io/github/fvarrui/javapackager/maven/CopyDependencies.java @@ -28,7 +28,7 @@ public CopyDependencies() { @Override public boolean skip(Packager packager) { - return !packager.getCopyDependencies(); + return !packager.task.getCopyDependencies(); } @Override diff --git a/src/main/java/io/github/fvarrui/javapackager/maven/CreateRunnableJar.java b/src/main/java/io/github/fvarrui/javapackager/maven/CreateRunnableJar.java index 3760ea38..f0108a83 100644 --- a/src/main/java/io/github/fvarrui/javapackager/maven/CreateRunnableJar.java +++ b/src/main/java/io/github/fvarrui/javapackager/maven/CreateRunnableJar.java @@ -38,12 +38,12 @@ public CreateRunnableJar() { protected File doApply(Packager packager) { String classifier = "runnable"; - String name = packager.getName(); - String version = packager.getVersion(); - String mainClass = packager.getMainClass(); - File outputDirectory = packager.getOutputDirectory(); + String name = packager.task.getName(); + String version = packager.task.getVersion(); + String mainClass = packager.task.getMainClass(); + File outputDirectory = packager.task.getOutputDirectory(); ExecutionEnvironment env = Context.getMavenContext().getEnv(); - Manifest manifest = packager.getManifest(); + Manifest manifest = packager.task.getManifest(); File jarFile = new File(outputDirectory, name + "-" + version + "-" + classifier + ".jar"); diff --git a/src/main/java/io/github/fvarrui/javapackager/maven/CreateTarball.java b/src/main/java/io/github/fvarrui/javapackager/maven/CreateTarball.java index 73a65ffd..1f76a21d 100644 --- a/src/main/java/io/github/fvarrui/javapackager/maven/CreateTarball.java +++ b/src/main/java/io/github/fvarrui/javapackager/maven/CreateTarball.java @@ -28,17 +28,17 @@ public CreateTarball() { @Override public boolean skip(Packager packager) { - return !packager.getCreateTarball(); + return !packager.task.getCreateTarball(); } @Override protected File doApply(Packager packager) { File assetsFolder = packager.getAssetsFolder(); - String name = packager.getName(); - String version = packager.getVersion(); - Platform platform = packager.getPlatform(); - File outputDirectory = packager.getOutputDirectory(); + String name = packager.task.getName(); + String version = packager.task.getVersion(); + Platform platform = packager.task.getPlatform(); + File outputDirectory = packager.task.getOutputDirectory(); try { diff --git a/src/main/java/io/github/fvarrui/javapackager/maven/CreateWindowsExeLaunch4j.java b/src/main/java/io/github/fvarrui/javapackager/maven/CreateWindowsExeLaunch4j.java index 48babc91..318f9fa1 100644 --- a/src/main/java/io/github/fvarrui/javapackager/maven/CreateWindowsExeLaunch4j.java +++ b/src/main/java/io/github/fvarrui/javapackager/maven/CreateWindowsExeLaunch4j.java @@ -35,15 +35,15 @@ public CreateWindowsExeLaunch4j() { @Override protected File doApply(WindowsPackager packager) throws Exception { - List vmArgs = packager.getVmArgs(); - WindowsConfig winConfig = packager.getWinConfig(); + List vmArgs = packager.task.getVmArgs(); + WindowsConfig winConfig = packager.task.getWinConfig(); File executable = packager.getExecutable(); - String mainClass = packager.getMainClass(); - boolean useResourcesAsWorkingDir = packager.isUseResourcesAsWorkingDir(); - boolean bundleJre = packager.getBundleJre(); - String jreDirectoryName = packager.getJreDirectoryName(); - String classpath = packager.getClasspath(); - String jreMinVersion = packager.getJreMinVersion(); + String mainClass = packager.task.getMainClass(); + boolean useResourcesAsWorkingDir = packager.task.isUseResourcesAsWorkingDir(); + boolean bundleJre = packager.task.getBundleJre(); + String jreDirectoryName = packager.task.getJreDirectoryName(); + String classpath = packager.task.getClasspath(); + String jreMinVersion = packager.task.getJreMinVersion(); File jarFile = packager.getJarFile(); File appFolder = packager.getAppFolder(); diff --git a/src/main/java/io/github/fvarrui/javapackager/maven/CreateZipball.java b/src/main/java/io/github/fvarrui/javapackager/maven/CreateZipball.java index 561b9620..63cb7e00 100644 --- a/src/main/java/io/github/fvarrui/javapackager/maven/CreateZipball.java +++ b/src/main/java/io/github/fvarrui/javapackager/maven/CreateZipball.java @@ -28,17 +28,17 @@ public CreateZipball() { @Override public boolean skip(Packager packager) { - return !packager.getCreateZipball(); + return !packager.task.getCreateZipball(); } @Override protected File doApply(Packager packager) { File assetsFolder = packager.getAssetsFolder(); - String name = packager.getName(); - String version = packager.getVersion(); - Platform platform = packager.getPlatform(); - File outputDirectory = packager.getOutputDirectory(); + String name = packager.task.getName(); + String version = packager.task.getVersion(); + Platform platform = packager.task.getPlatform(); + File outputDirectory = packager.task.getOutputDirectory(); try { diff --git a/src/main/java/io/github/fvarrui/javapackager/maven/MavenContext.java b/src/main/java/io/github/fvarrui/javapackager/maven/MavenContext.java index 49506334..a66daf09 100644 --- a/src/main/java/io/github/fvarrui/javapackager/maven/MavenContext.java +++ b/src/main/java/io/github/fvarrui/javapackager/maven/MavenContext.java @@ -66,7 +66,7 @@ public File resolveLicense(Packager packager) throws Exception { @Override public File createWindowsExe(WindowsPackager packager) throws Exception { AbstractCreateWindowsExe createWindowsExe; - switch (packager.getWinConfig().getExeCreationTool()) { + switch (packager.task.getWinConfig().getExeCreationTool()) { case launch4j: createWindowsExe = new CreateWindowsExeLaunch4j(); break; case why: createWindowsExe = new CreateWindowsExeWhy(); break; case winrun4j: createWindowsExe = new CreateWindowsExeWinRun4j(); break; diff --git a/src/main/java/io/github/fvarrui/javapackager/maven/ResolveLicenseFromPOM.java b/src/main/java/io/github/fvarrui/javapackager/maven/ResolveLicenseFromPOM.java index d3498ae5..2d729cdf 100644 --- a/src/main/java/io/github/fvarrui/javapackager/maven/ResolveLicenseFromPOM.java +++ b/src/main/java/io/github/fvarrui/javapackager/maven/ResolveLicenseFromPOM.java @@ -27,7 +27,7 @@ public ResolveLicenseFromPOM() { protected File doApply(Packager packager) { Logger.infoIndent("Trying to resolve license from POM ..."); - File licenseFile = packager.getLicenseFile(); + File licenseFile = packager.task.getLicenseFile(); List licenses = Context.getMavenContext().getEnv().getMavenProject().getLicenses(); File assetsFolder = packager.getAssetsFolder(); diff --git a/src/main/java/io/github/fvarrui/javapackager/model/MacConfig.java b/src/main/java/io/github/fvarrui/javapackager/model/MacConfig.java index 6d961be6..21880f8f 100644 --- a/src/main/java/io/github/fvarrui/javapackager/model/MacConfig.java +++ b/src/main/java/io/github/fvarrui/javapackager/model/MacConfig.java @@ -267,6 +267,6 @@ public void setDefaults(Packager packager) { this.setIconY(defaultIfNull(this.getIconY(), 116)); this.setAppsLinkIconX(defaultIfNull(this.getAppsLinkIconX(), 360)); this.setAppsLinkIconY(defaultIfNull(this.getAppsLinkIconY(), 116)); - this.setAppId(defaultIfNull(this.getAppId(), packager.getMainClass())); + this.setAppId(defaultIfNull(this.getAppId(), packager.task.getMainClass())); } } diff --git a/src/main/java/io/github/fvarrui/javapackager/model/WindowsConfig.java b/src/main/java/io/github/fvarrui/javapackager/model/WindowsConfig.java index 8f7637e3..4c79247a 100644 --- a/src/main/java/io/github/fvarrui/javapackager/model/WindowsConfig.java +++ b/src/main/java/io/github/fvarrui/javapackager/model/WindowsConfig.java @@ -329,15 +329,15 @@ public String toString() { public void setDefaults(Packager packager) { this.setHeaderType(ObjectUtils.defaultIfNull(this.getHeaderType(), HeaderType.gui)); this.setFileVersion(defaultIfBlank(this.getFileVersion(), "1.0.0.0")); - this.setTxtFileVersion(defaultIfBlank(this.getTxtFileVersion(), "" + packager.getVersion())); + this.setTxtFileVersion(defaultIfBlank(this.getTxtFileVersion(), "" + packager.task.getVersion())); this.setProductVersion(defaultIfBlank(this.getProductVersion(), "1.0.0.0")); - this.setTxtProductVersion(defaultIfBlank(this.getTxtProductVersion(), "" + packager.getVersion())); - this.setCompanyName(defaultIfBlank(this.getCompanyName(), packager.getOrganizationName())); - this.setCopyright(defaultIfBlank(this.getCopyright(), packager.getOrganizationName())); - this.setFileDescription(defaultIfBlank(this.getFileDescription(), packager.getDescription())); - this.setProductName(defaultIfBlank(this.getProductName(), packager.getName())); - this.setInternalName(defaultIfBlank(this.getInternalName(), packager.getName())); - this.setOriginalFilename(defaultIfBlank(this.getOriginalFilename(), packager.getName() + ".exe")); + this.setTxtProductVersion(defaultIfBlank(this.getTxtProductVersion(), "" + packager.task.getVersion())); + this.setCompanyName(defaultIfBlank(this.getCompanyName(), packager.task.getOrganizationName())); + this.setCopyright(defaultIfBlank(this.getCopyright(), packager.task.getOrganizationName())); + this.setFileDescription(defaultIfBlank(this.getFileDescription(), packager.task.getDescription())); + this.setProductName(defaultIfBlank(this.getProductName(), packager.task.getName())); + this.setInternalName(defaultIfBlank(this.getInternalName(), packager.task.getName())); + this.setOriginalFilename(defaultIfBlank(this.getOriginalFilename(), packager.task.getName() + ".exe")); this.setMsiUpgradeCode(defaultIfBlank(this.getMsiUpgradeCode(), UUID.randomUUID().toString())); } diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/AbstractCreateWindowsExe.java b/src/main/java/io/github/fvarrui/javapackager/packagers/AbstractCreateWindowsExe.java index 6f7288a6..0b365edf 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/AbstractCreateWindowsExe.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/AbstractCreateWindowsExe.java @@ -65,7 +65,7 @@ public File getOutputFolder() { protected void createAssets(WindowsPackager packager) throws Exception { File manifestFile = packager.getManifestFile(); - File iconFile = packager.getIconFile(); + File iconFile = packager.task.getIconFile(); File jarFile = packager.getJarFile(); FileUtils.mkdir(outputFolder); @@ -90,10 +90,10 @@ protected void createAssets(WindowsPackager packager) throws Exception { protected File createBootstrapScript(WindowsPackager packager) throws Exception { File executable = packager.getExecutable(); - if (FileUtils.exists(packager.getScripts().getBootstrap())) { + if (FileUtils.exists(packager.task.getScripts().getBootstrap())) { // generates startup VBS script file - File vbsFile = new File(packager.getAppFolder(), packager.getName() + ".vbs"); + File vbsFile = new File(packager.getAppFolder(), packager.task.getName() + ".vbs"); VelocityUtils.render(Platform.windows + "/startup.vbs.vtl", vbsFile, packager); executable = vbsFile; diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/BundleJre.java b/src/main/java/io/github/fvarrui/javapackager/packagers/BundleJre.java index b649623d..8e945f13 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/BundleJre.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/BundleJre.java @@ -27,25 +27,25 @@ public BundleJre() { @Override public boolean skip(Packager packager) { - return !packager.getBundleJre(); + return !packager.task.getBundleJre(); } @Override protected File doApply(Packager packager) throws Exception { - boolean bundleJre = packager.getBundleJre(); - File specificJreFolder = packager.getJrePath(); - Platform platform = packager.getPlatform(); + boolean bundleJre = packager.task.getBundleJre(); + File specificJreFolder = packager.task.getJrePath(); + Platform platform = packager.task.getPlatform(); File destinationFolder = packager.getJreDestinationFolder(); - File jdkPath = packager.getJdkPath(); + File jdkPath = packager.task.getJdkPath(); File libsFolder = packager.getLibsFolder(); - boolean customizedJre = packager.getCustomizedJre(); + boolean customizedJre = packager.task.getCustomizedJre(); File jarFile = packager.getJarFile(); - List requiredModules = packager.getModules(); - List additionalModules = packager.getAdditionalModules(); - List additionalModulePaths = packager.getAdditionalModulePaths(); + List requiredModules = packager.task.getModules(); + List additionalModules = packager.task.getAdditionalModules(); + List additionalModulePaths = packager.task.getAdditionalModulePaths(); - File currentJdk = packager.getPackagingJdk(); + File currentJdk = packager.task.getPackagingJdk(); Logger.infoIndent("Bundling JRE ... with " + currentJdk); @@ -165,7 +165,7 @@ protected File doApply(Packager packager) throws Exception { // updates bundle jre property value, as this artifact generator could disable this option // (e.g. when bundling a jre from a different platform than the current one) - packager.bundleJre(bundleJre); + packager.task.bundleJre(bundleJre); return destinationFolder; } diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/CreateWindowsExeWhy.java b/src/main/java/io/github/fvarrui/javapackager/packagers/CreateWindowsExeWhy.java index e424d26e..7d999476 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/CreateWindowsExeWhy.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/CreateWindowsExeWhy.java @@ -21,8 +21,8 @@ public CreateWindowsExeWhy() { @Override public boolean skip(WindowsPackager packager) { - if (!packager.getPlatform().isCurrentPlatform()) { - Logger.error(getArtifactName() + " cannot be generated with Why due to the target platform (" + packager.getPlatform() + ") is different from the execution platform (" + Platform.getCurrentPlatform() + ")!"); + if (!packager.task.getPlatform().isCurrentPlatform()) { + Logger.error(getArtifactName() + " cannot be generated with Why due to the target platform (" + packager.task.getPlatform() + ") is different from the execution platform (" + Platform.getCurrentPlatform() + ")!"); return true; } @@ -32,13 +32,13 @@ public boolean skip(WindowsPackager packager) { @Override protected File doApply(WindowsPackager packager) throws Exception { - String name = packager.getName(); + String name = packager.task.getName(); File executable = packager.getExecutable(); File manifestFile = packager.getManifestFile(); - File iconFile = packager.getIconFile(); + File iconFile = packager.task.getIconFile(); File appFolder = packager.getAppFolder(); File jarFile = packager.getJarFile(); - WindowsConfig winConfig = packager.getWinConfig(); + WindowsConfig winConfig = packager.task.getWinConfig(); if (winConfig.isWrapJar()) { Logger.warn("'wrapJar' property ignored when building EXE with " + getArtifactName()); @@ -53,7 +53,7 @@ protected File doApply(WindowsPackager packager) throws Exception { FileUtils.copyFileToFile(iconFile, getGenericIcon()); // creates generic exe - FileUtils.copyResourceToFile("/windows/JavaLauncher.exe", getGenericExe(), packager.getAssetsDir()); + FileUtils.copyResourceToFile("/windows/JavaLauncher.exe", getGenericExe(), packager.task.getAssetsDir()); // copies rcedit command line tool (needed to manipulate exe) File rcedit = new File(getOutputFolder(), "rcedit.exe"); diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/CreateWindowsExeWinRun4j.java b/src/main/java/io/github/fvarrui/javapackager/packagers/CreateWindowsExeWinRun4j.java index 840e0e4c..025d28cb 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/CreateWindowsExeWinRun4j.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/CreateWindowsExeWinRun4j.java @@ -34,8 +34,8 @@ public CreateWindowsExeWinRun4j() { @Override public boolean skip(WindowsPackager packager) { - if (!packager.getPlatform().isCurrentPlatform()) { - Logger.error(getArtifactName() + " cannot be generated with WinRun4J due to the target platform (" + packager.getPlatform() + ") is different from the execution platform (" + Platform.getCurrentPlatform() + ")!"); + if (!packager.task.getPlatform().isCurrentPlatform()) { + Logger.error(getArtifactName() + " cannot be generated with WinRun4J due to the target platform (" + packager.task.getPlatform() + ") is different from the execution platform (" + Platform.getCurrentPlatform() + ")!"); return true; } @@ -45,18 +45,18 @@ public boolean skip(WindowsPackager packager) { @Override protected File doApply(WindowsPackager packager) throws Exception { - String name = packager.getName(); + String name = packager.task.getName(); File executable = packager.getExecutable(); File jarFile = packager.getJarFile(); File manifestFile = packager.getManifestFile(); - File iconFile = packager.getIconFile(); + File iconFile = packager.task.getIconFile(); File libsFolder = packager.getLibsFolder(); File appFolder = packager.getAppFolder(); - String mainClass = packager.getMainClass(); + String mainClass = packager.task.getMainClass(); File jreDestinationFolder = packager.getJreDestinationFolder(); - boolean bundleJre = packager.getBundleJre(); - String vmLocation = packager.getWinConfig().getVmLocation(); - WindowsConfig winConfig = packager.getWinConfig(); + boolean bundleJre = packager.task.getBundleJre(); + String vmLocation = packager.task.getWinConfig().getVmLocation(); + WindowsConfig winConfig = packager.task.getWinConfig(); if (winConfig.isWrapJar()) { Logger.warn("'wrapJar' property ignored when building EXE with " + getArtifactName()); @@ -112,7 +112,7 @@ protected File doApply(WindowsPackager packager) throws Exception { } // sets vmLocation in winConfig, so it will be used when rendering INI file - packager.getWinConfig().setVmLocation(vmLocation); + packager.task.getWinConfig().setVmLocation(vmLocation); Logger.info("Using 'vmLocation=" + vmLocation + "'!"); diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateAppImage.java b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateAppImage.java index a076215e..60f32fe0 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateAppImage.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateAppImage.java @@ -23,12 +23,12 @@ public GenerateAppImage() { @Override public boolean skip(LinuxPackager packager) { - if (!packager.getLinuxConfig().isGenerateAppImage()) { + if (!packager.task.getLinuxConfig().isGenerateAppImage()) { return true; } - if (!packager.getPlatform().isCurrentPlatform() && !packager.isForceInstaller()) { - Logger.warn(getArtifactName() + " cannot be generated due to the target platform (" + packager.getPlatform() + ") is different from the execution platform (" + Platform.getCurrentPlatform() + ")!"); + if (!packager.task.getPlatform().isCurrentPlatform() && !packager.task.isForceInstaller()) { + Logger.warn(getArtifactName() + " cannot be generated due to the target platform (" + packager.task.getPlatform() + ") is different from the execution platform (" + Platform.getCurrentPlatform() + ")!"); return true; } @@ -40,11 +40,11 @@ public boolean skip(LinuxPackager packager) { protected File doApply(LinuxPackager packager) throws Exception { File appFolder = packager.getAppFolder(); - File outputFolder = packager.getOutputDirectory(); - String name = packager.getName(); + File outputFolder = packager.task.getOutputDirectory(); + String name = packager.task.getName(); File executable = packager.getExecutable(); File assetsFolder = packager.getAssetsFolder(); - File iconFile = packager.getIconFile(); + File iconFile = packager.task.getIconFile(); // output AppImage file File appImage = new File(outputFolder, name + ".AppImage"); diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateDeb.java b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateDeb.java index 8c4852b1..6c72f880 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateDeb.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateDeb.java @@ -48,19 +48,19 @@ public void debug(String message) { @Override public boolean skip(LinuxPackager packager) { - return !packager.getLinuxConfig().isGenerateDeb(); + return !packager.task.getLinuxConfig().isGenerateDeb(); } @Override protected File doApply(LinuxPackager packager) throws Exception { File assetsFolder = packager.getAssetsFolder(); - String name = packager.getName(); + String name = packager.task.getName(); File appFolder = packager.getAppFolder(); - File outputDirectory = packager.getOutputDirectory(); - String version = packager.getVersion(); - boolean bundleJre = packager.getBundleJre(); - String jreDirectoryName = packager.getJreDirectoryName(); + File outputDirectory = packager.task.getOutputDirectory(); + String version = packager.task.getVersion(); + boolean bundleJre = packager.task.getBundleJre(); + String jreDirectoryName = packager.task.getJreDirectoryName(); File executable = packager.getExecutable(); File javaFile = new File(appFolder, jreDirectoryName + "/bin/java"); diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateDmg.java b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateDmg.java index e0b2d610..a867aa69 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateDmg.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateDmg.java @@ -28,12 +28,12 @@ public GenerateDmg() { @Override public boolean skip(MacPackager packager) { - if (!packager.getMacConfig().isGenerateDmg()) { + if (!packager.task.getMacConfig().isGenerateDmg()) { return true; } - if (!packager.getPlatform().isCurrentPlatform() && !packager.isForceInstaller()) { - Logger.warn(getArtifactName() + " cannot be generated due to the target platform (" + packager.getPlatform() + ") is different from the execution platform (" + Platform.getCurrentPlatform() + ")!"); + if (!packager.task.getPlatform().isCurrentPlatform() && !packager.task.isForceInstaller()) { + Logger.warn(getArtifactName() + " cannot be generated due to the target platform (" + packager.task.getPlatform() + ") is different from the execution platform (" + Platform.getCurrentPlatform() + ")!"); return true; } @@ -45,11 +45,11 @@ protected File doApply(MacPackager packager) throws Exception { File appFolder = packager.getAppFolder(); File assetsFolder = packager.getAssetsFolder(); - String name = packager.getName(); - File outputDirectory = packager.getOutputDirectory(); - File iconFile = packager.getIconFile(); - String version = packager.getVersion(); - MacConfig macConfig = packager.getMacConfig(); + String name = packager.task.getName(); + File outputDirectory = packager.task.getOutputDirectory(); + File iconFile = packager.task.getIconFile(); + String version = packager.task.getVersion(); + MacConfig macConfig = packager.task.getMacConfig(); // sets volume name if blank String volumeName = defaultIfBlank(macConfig.getVolumeName(), name); diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateMsi.java b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateMsi.java index 10f3e9ca..fc4d72f6 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateMsi.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateMsi.java @@ -22,12 +22,12 @@ public GenerateMsi() { @Override public boolean skip(WindowsPackager packager) { - if (!packager.getWinConfig().isGenerateMsi()) { + if (!packager.task.getWinConfig().isGenerateMsi()) { return true; } - if (!packager.getPlatform().isCurrentPlatform() && !packager.isForceInstaller()) { - Logger.warn(getArtifactName() + " cannot be generated due to the target platform (" + packager.getPlatform() + ") is different from the execution platform (" + Platform.getCurrentPlatform() + ")!"); + if (!packager.task.getPlatform().isCurrentPlatform() && !packager.task.isForceInstaller()) { + Logger.warn(getArtifactName() + " cannot be generated due to the target platform (" + packager.task.getPlatform() + ") is different from the execution platform (" + Platform.getCurrentPlatform() + ")!"); return true; } @@ -41,9 +41,9 @@ protected File doApply(WindowsPackager packager) throws Exception { Logger.info("MSM file generated in " + msmFile); File assetsFolder = packager.getAssetsFolder(); - String name = packager.getName(); - File outputDirectory = packager.getOutputDirectory(); - String version = packager.getVersion(); + String name = packager.task.getName(); + File outputDirectory = packager.task.getOutputDirectory(); + String version = packager.task.getVersion(); // generates WXS file from velocity template File wxsFile = new File(assetsFolder, name + ".wxs"); diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateMsm.java b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateMsm.java index 3aad9dc4..8bef27ec 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateMsm.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateMsm.java @@ -21,12 +21,12 @@ public GenerateMsm() { @Override public boolean skip(WindowsPackager packager) { - if (!packager.getWinConfig().isGenerateMsm() && !packager.getWinConfig().isGenerateMsi()) { + if (!packager.task.getWinConfig().isGenerateMsm() && !packager.task.getWinConfig().isGenerateMsi()) { return true; } - if (!packager.getPlatform().isCurrentPlatform() && !packager.isForceInstaller()) { - Logger.warn(getArtifactName() + " cannot be generated due to the target platform (" + packager.getPlatform() + ") is different from the execution platform (" + Platform.getCurrentPlatform() + ")!"); + if (!packager.task.getPlatform().isCurrentPlatform() && !packager.task.isForceInstaller()) { + Logger.warn(getArtifactName() + " cannot be generated due to the target platform (" + packager.task.getPlatform() + ") is different from the execution platform (" + Platform.getCurrentPlatform() + ")!"); return true; } @@ -41,9 +41,9 @@ protected File doApply(WindowsPackager packager) throws Exception { } File assetsFolder = packager.getAssetsFolder(); - String name = packager.getName(); - File outputDirectory = packager.getOutputDirectory(); - String version = packager.getVersion(); + String name = packager.task.getName(); + File outputDirectory = packager.task.getOutputDirectory(); + String version = packager.task.getVersion(); // generates WXS file from velocity template File wxsFile = new File(assetsFolder, name + ".msm.wxs"); diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/GeneratePkg.java b/src/main/java/io/github/fvarrui/javapackager/packagers/GeneratePkg.java index 69e595be..312901de 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/GeneratePkg.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/GeneratePkg.java @@ -19,12 +19,12 @@ public GeneratePkg() { @Override public boolean skip(MacPackager packager) { - if (!packager.getMacConfig().isGeneratePkg()) { + if (!packager.task.getMacConfig().isGeneratePkg()) { return true; } - if (!packager.getPlatform().isCurrentPlatform() && !packager.isForceInstaller()) { - Logger.warn(getArtifactName() + " cannot be generated due to the target platform (" + packager.getPlatform() + ") is different from the execution platform (" + Platform.getCurrentPlatform() + ")!"); + if (!packager.task.getPlatform().isCurrentPlatform() && !packager.task.isForceInstaller()) { + Logger.warn(getArtifactName() + " cannot be generated due to the target platform (" + packager.task.getPlatform() + ") is different from the execution platform (" + Platform.getCurrentPlatform() + ")!"); return true; } @@ -35,9 +35,9 @@ public boolean skip(MacPackager packager) { protected File doApply(MacPackager packager) throws Exception { File appFile = packager.getAppFile(); - String name = packager.getName(); - File outputDirectory = packager.getOutputDirectory(); - String version = packager.getVersion(); + String name = packager.task.getName(); + File outputDirectory = packager.task.getOutputDirectory(); + String version = packager.task.getVersion(); File pkgFile = new File(outputDirectory, name + "_" + version + ".pkg"); diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateRpm.java b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateRpm.java index b139a373..00f0be5d 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateRpm.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateRpm.java @@ -27,21 +27,21 @@ public GenerateRpm() { @Override public boolean skip(LinuxPackager packager) { - return !packager.getLinuxConfig().isGenerateRpm(); + return !packager.task.getLinuxConfig().isGenerateRpm(); } @Override protected File doApply(LinuxPackager packager) throws Exception { File appFolder = packager.getAppFolder(); - String name = packager.getName(); - String version = packager.getVersion().replaceAll("-", "_"); - String description = packager.getDescription(); - String organizationName = packager.getOrganizationName(); - File outputDirectory = packager.getOutputDirectory(); + String name = packager.task.getName(); + String version = packager.task.getVersion().replaceAll("-", "_"); + String description = packager.task.getDescription(); + String organizationName = packager.task.getOrganizationName(); + File outputDirectory = packager.task.getOutputDirectory(); File executable = packager.getExecutable(); File assetsFolder = packager.getAssetsFolder(); - String jreDirectoryName = packager.getJreDirectoryName(); + String jreDirectoryName = packager.task.getJreDirectoryName(); // generates desktop file from velocity template File desktopFile = new File(assetsFolder, name + ".desktop"); diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateSetup.java b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateSetup.java index 5821da62..888d4a55 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateSetup.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateSetup.java @@ -24,12 +24,12 @@ public GenerateSetup() { @Override public boolean skip(WindowsPackager packager) { - if (!packager.getWinConfig().isGenerateSetup()) { + if (!packager.task.getWinConfig().isGenerateSetup()) { return true; } - if (!packager.getPlatform().isCurrentPlatform() && !packager.isForceInstaller()) { - Logger.warn(getArtifactName() + " cannot be generated due to the target platform (" + packager.getPlatform() + ") is different from the execution platform (" + Platform.getCurrentPlatform() + ")!"); + if (!packager.task.getPlatform().isCurrentPlatform() && !packager.task.isForceInstaller()) { + Logger.warn(getArtifactName() + " cannot be generated due to the target platform (" + packager.task.getPlatform() + ") is different from the execution platform (" + Platform.getCurrentPlatform() + ")!"); return true; } @@ -39,12 +39,12 @@ public boolean skip(WindowsPackager packager) { @Override protected File doApply(WindowsPackager packager) throws Exception { - File iconFile = packager.getIconFile(); + File iconFile = packager.task.getIconFile(); File assetsFolder = packager.getAssetsFolder(); - String name = packager.getName(); - File outputDirectory = packager.getOutputDirectory(); - String version = packager.getVersion(); - Registry registry = packager.getWinConfig().getRegistry(); + String name = packager.task.getName(); + File outputDirectory = packager.task.getOutputDirectory(); + String version = packager.task.getVersion(); + Registry registry = packager.task.getWinConfig().getRegistry(); // checks if registry entries' names are not empy if (registry.getEntries().stream().anyMatch(e -> StringUtils.isBlank(e.getKey()) || StringUtils.isBlank(e.getValueName()))) { diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/LinuxPackager.java b/src/main/java/io/github/fvarrui/javapackager/packagers/LinuxPackager.java index 8a1d091a..804918d0 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/LinuxPackager.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/LinuxPackager.java @@ -4,6 +4,7 @@ import java.util.Arrays; import java.util.stream.Collectors; +import io.github.fvarrui.javapackager.PackageTask; import org.apache.commons.lang3.StringUtils; import io.github.fvarrui.javapackager.model.Platform; @@ -19,8 +20,8 @@ public class LinuxPackager extends Packager { private File desktopFile; private File mimeXmlFile = null; - public LinuxPackager() { - super(); + public LinuxPackager(PackageTask task) { + super(task); installerGenerators.addAll(Context.getContext().getInstallerGenerators(Platform.linux)); } @@ -36,7 +37,7 @@ public File getMimeXmlFile() { public void doInit() throws Exception { // sets linux config default values - this.linuxConfig.setDefaults(this); + task.getLinuxConfig().setDefaults(this); } @@ -46,7 +47,7 @@ protected void doCreateAppStructure() throws Exception { // sets common folders this.executableDestinationFolder = appFolder; this.jarFileDestinationFolder = appFolder; - this.jreDestinationFolder = new File(appFolder, jreDirectoryName); + this.jreDestinationFolder = new File(appFolder, task.getJreDirectoryName()); this.resourcesDestinationFolder = appFolder; } @@ -60,25 +61,25 @@ public File doCreateApp() throws Exception { Logger.infoIndent("Creating GNU/Linux executable ..."); // sets executable file - this.executable = new File(appFolder, name); + this.executable = new File(appFolder, task.getName()); // process classpath - if (classpath != null) { - classpaths = Arrays.asList(classpath.split("[:;]")); - if (!isUseResourcesAsWorkingDir()) { + if (task.getClasspath() != null) { + classpaths = Arrays.asList(task.getClasspath().split("[:;]")); + if (!task.isUseResourcesAsWorkingDir()) { classpaths = classpaths.stream().map(cp -> new File(cp).isAbsolute() ? cp : "$SCRIPTPATH/" + cp).collect(Collectors.toList()); } - classpath = StringUtils.join(classpaths, ":"); + task.classpath(StringUtils.join(classpaths, ":")); } // generates desktop file from velocity template - desktopFile = new File(assetsFolder, name + ".desktop"); + desktopFile = new File(assetsFolder, task.getName() + ".desktop"); VelocityUtils.render("linux/desktop.vtl", desktopFile, this); Logger.info("Rendering desktop file to " + desktopFile.getAbsolutePath()); // generates mime.xml file from velocity template - if (isThereFileAssociations()) { - mimeXmlFile = new File(assetsFolder, name + ".xml"); + if (task.isThereFileAssociations()) { + mimeXmlFile = new File(assetsFolder, task.getName() + ".xml"); VelocityUtils.render("linux/mime.xml.vtl", mimeXmlFile, this); Logger.info("Rendering mime.xml file to " + mimeXmlFile.getAbsolutePath()); } @@ -89,7 +90,7 @@ public File doCreateApp() throws Exception { Logger.info("Startup script generated in " + startupFile.getAbsolutePath()); // concats linux startup.sh script + generated jar in executable (binary) - if (getLinuxConfig().isWrapJar()) + if (task.getLinuxConfig().isWrapJar()) FileUtils.concat(executable, startupFile, jarFile); else { FileUtils.copyFileToFile(startupFile, executable); diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java b/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java index 78612e4f..ddf4f858 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.stream.Collectors; +import io.github.fvarrui.javapackager.PackageTask; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.SystemUtils; @@ -28,6 +29,10 @@ public class MacPackager extends Packager { private File javaFolder; private File macOSFolder; + public MacPackager(PackageTask task) { + super(task); + } + public File getAppFile() { return appFile; } @@ -35,12 +40,12 @@ public File getAppFile() { @Override public void doInit() throws Exception { - this.macConfig.setDefaults(this); + this.task.getMacConfig().setDefaults(this); // FIX useResourcesAsWorkingDir=false doesn't work fine on Mac OS (option // disabled) - if (!this.isUseResourcesAsWorkingDir()) { - this.useResourcesAsWorkingDir = true; + if (!this.task.isUseResourcesAsWorkingDir()) { + this.task.useResourcesAsWorkingDir(true); Logger.warn( "'useResourcesAsWorkingDir' property disabled on Mac OS (useResourcesAsWorkingDir is always true)"); } @@ -51,10 +56,10 @@ public void doInit() throws Exception { protected void doCreateAppStructure() throws Exception { // initializes the references to the app structure folders - this.appFile = new File(appFolder, name + ".app"); + this.appFile = new File(appFolder, task.getName() + ".app"); this.contentsFolder = new File(appFile, "Contents"); this.resourcesFolder = new File(contentsFolder, "Resources"); - this.javaFolder = new File(resourcesFolder, this.macConfig.isRelocateJar() ? "Java" : ""); + this.javaFolder = new File(resourcesFolder, this.task.getMacConfig().isRelocateJar() ? "Java" : ""); this.macOSFolder = new File(contentsFolder, "MacOS"); // makes dirs @@ -77,7 +82,7 @@ protected void doCreateAppStructure() throws Exception { // sets common folders this.executableDestinationFolder = macOSFolder; this.jarFileDestinationFolder = javaFolder; - this.jreDestinationFolder = new File(contentsFolder, "PlugIns/" + jreDirectoryName + "/Contents/Home"); + this.jreDestinationFolder = new File(contentsFolder, "PlugIns/" + task.getJreDirectoryName() + "/Contents/Home"); this.resourcesDestinationFolder = resourcesFolder; } @@ -91,7 +96,7 @@ public File doCreateApp() throws Exception { // copies jarfile to Java folder FileUtils.copyFileToFolder(jarFile, javaFolder); - if (this.administratorRequired) { + if (this.task.getAdministratorRequired()) { // sets startup file this.executable = new File(macOSFolder, "startup"); @@ -112,7 +117,7 @@ public File doCreateApp() throws Exception { // copies universalJavaApplicationStub startup file to boot java app File appStubFile = new File(macOSFolder, "universalJavaApplicationStub"); String universalJavaApplicationStubResource = null; - switch (macConfig.getMacStartup()) { + switch (task.getMacConfig().getMacStartup()) { case UNIVERSAL: universalJavaApplicationStubResource = "universalJavaApplicationStub"; break; case X86_64: universalJavaApplicationStubResource = "universalJavaApplicationStub.x86_64"; break; case ARM64: universalJavaApplicationStubResource = "universalJavaApplicationStub.arm64"; break; @@ -122,15 +127,15 @@ public File doCreateApp() throws Exception { appStubFile.setExecutable(true, false); // process classpath - classpath = (this.macConfig.isRelocateJar() ? "Java/" : "") + this.jarFile.getName() + (classpath != null ? ":" + classpath : ""); - classpaths = Arrays.asList(classpath.split("[:;]")); - if (!isUseResourcesAsWorkingDir()) { + task.classpath((task.getMacConfig().isRelocateJar() ? "Java/" : "") + this.jarFile.getName() + (task.getClasspath() != null ? ":" + task.getClasspath() : "")); + classpaths = Arrays.asList(task.getClasspath().split("[:;]")); + if (!task.isUseResourcesAsWorkingDir()) { classpaths = classpaths .stream() .map(cp -> new File(cp).isAbsolute() ? cp : "$ResourcesFolder/" + cp) .collect(Collectors.toList()); } - classpath = StringUtils.join(classpaths, ":"); + task.classpath(StringUtils.join(classpaths, ":")); // creates and write the Info.plist file File infoPlistFile = new File(contentsFolder, "Info.plist"); @@ -139,18 +144,18 @@ public File doCreateApp() throws Exception { Logger.info("Info.plist file created in " + infoPlistFile.getAbsolutePath()); // copy provisionprofile - if(macConfig.getProvisionProfile() != null) { + if(task.getMacConfig().getProvisionProfile() != null) { // file name must be 'embedded.provisionprofile' - FileUtils.copyFileToFile(macConfig.getProvisionProfile(), new File(contentsFolder, "embedded.provisionprofile")); + FileUtils.copyFileToFile(task.getMacConfig().getProvisionProfile(), new File(contentsFolder, "embedded.provisionprofile")); } // codesigns app folder if (!Platform.mac.isCurrentPlatform()) { Logger.warn("Generated app could not be signed due to current platform is " + Platform.getCurrentPlatform()); - } else if (!getMacConfig().isCodesignApp()) { + } else if (!task.getMacConfig().isCodesignApp()) { Logger.warn("App codesigning disabled"); } else { - codesign(this.macConfig.getDeveloperId(), this.macConfig.getEntitlements(), this.appFile); + codesign(task.getMacConfig().getDeveloperId(), task.getMacConfig().getEntitlements(), this.appFile); } return appFile; @@ -160,7 +165,7 @@ private void codesign(String developerId, File entitlements, File appFile) throw // checks --option flags List flags = new ArrayList<>(); - if (macConfig.isHardenedCodesign()) { + if (task.getMacConfig().isHardenedCodesign()) { if (VersionUtils.compareVersions("10.13.6", SystemUtils.OS_VERSION) >= 0) { flags.add("runtime"); // enable hardened runtime if Mac OS version >= 10.13.6 } else { diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/Packager.java b/src/main/java/io/github/fvarrui/javapackager/packagers/Packager.java index 6bef3148..57df367a 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/Packager.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/Packager.java @@ -11,7 +11,10 @@ import java.util.List; import io.github.fvarrui.javapackager.PackageTask; +import io.github.fvarrui.javapackager.model.LinuxConfig; +import io.github.fvarrui.javapackager.model.MacConfig; import io.github.fvarrui.javapackager.model.Platform; +import io.github.fvarrui.javapackager.model.WindowsConfig; import io.github.fvarrui.javapackager.utils.FileUtils; import io.github.fvarrui.javapackager.utils.IconUtils; import io.github.fvarrui.javapackager.utils.Logger; @@ -21,9 +24,10 @@ /** * Packager base class */ -public abstract class Packager extends PackageTask { +public abstract class Packager { private static final String DEFAULT_ORGANIZATION_NAME = "ACME"; + public PackageTask task; // artifact generators protected List> installerGenerators = new ArrayList<>(); @@ -90,81 +94,83 @@ public File getBootstrapFile() { // =============================================== - public Packager() { + public Packager(PackageTask task) { super(); + this.task = task; Logger.info("Using packager " + this.getClass().getName()); } + private void init() throws Exception { Logger.infoIndent("Initializing packager ..."); - if (mainClass == null || mainClass.isEmpty()) { + if (task.getMainClass() == null || task.getMainClass().isEmpty()) { throw new Exception("'mainClass' cannot be null"); } // sets assetsDir for velocity to locate custom velocity templates - VelocityUtils.setAssetsDir(assetsDir); + VelocityUtils.setAssetsDir(task.getAssetsDir()); // using name as displayName, if it's not specified - displayName = defaultIfBlank(displayName, name); + task.displayName(defaultIfBlank(task.getDisplayName(), task.getName())); // using displayName as description, if it's not specified - description = defaultIfBlank(description, displayName); + task.description(defaultIfBlank(task.getDescription(), task.getDisplayName())); // using "ACME" as organizationName, if it's not specified - organizationName = defaultIfBlank(organizationName, DEFAULT_ORGANIZATION_NAME); + task.organizationName(defaultIfBlank(task.getOrganizationName(), DEFAULT_ORGANIZATION_NAME)); // using empty string as organizationUrl, if it's not specified - organizationUrl = defaultIfBlank(organizationUrl, ""); + task.organizationUrl(defaultIfBlank(task.getOrganizationUrl(), "")); // determines target platform if not specified - if (platform == null || platform == Platform.auto) { - platform = Platform.getCurrentPlatform(); + if (task.getPlatform() == null || task.getPlatform() == Platform.auto) { + task.platform(Platform.getCurrentPlatform()); } // sets jdkPath by default if not specified - if (jdkPath == null) { - TaskJavaUpdater taskJavaUpdater = new TaskJavaUpdater(platform); - taskJavaUpdater.execute(jdkVersion, jdkVendor); - jdkPath = taskJavaUpdater.jdkPath; + if (task.getJdkPath() == null) { + TaskJavaUpdater taskJavaUpdater = new TaskJavaUpdater(task.getPlatform()); + taskJavaUpdater.execute(task.getJdkVersion(), task.getJdkVendor()); + task.jdkPath(taskJavaUpdater.jdkPath); } - if (!jdkPath.exists()) { - throw new Exception("JDK path doesn't exist: " + jdkPath); + if (!task.getJdkPath().exists()) { + throw new Exception("JDK path doesn't exist: " + task.getJdkPath()); } // check if name is valid as filename try { - Paths.get(name); - if (name.contains("/")) - throw new InvalidPathException(name, "Illegal char "); - if (name.contains("\\")) - throw new InvalidPathException(name, "Illegal char <\\>"); + Paths.get(task.getName()); + if (task.getName().contains("/")) + throw new InvalidPathException(task.getName(), "Illegal char "); + if (task.getName().contains("\\")) + throw new InvalidPathException(task.getName(), "Illegal char <\\>"); } catch (InvalidPathException e) { - throw new Exception("Invalid name specified: " + name, e); + throw new Exception("Invalid name specified: " + task.getName(), e); } // init setup languages - if (platform.equals(Platform.windows) && (winConfig.getSetupLanguages() == null || winConfig.getSetupLanguages().isEmpty())) { - winConfig.getSetupLanguages().put("english", "compiler:Default.isl"); - winConfig.getSetupLanguages().put("spanish", "compiler:Languages\\Spanish.isl"); + if (task.getPlatform().equals(Platform.windows) && (task.getWinConfig().getSetupLanguages() == null || task.getWinConfig().getSetupLanguages().isEmpty())) { + task.getWinConfig().getSetupLanguages().put("english", "compiler:Default.isl"); + task.getWinConfig().getSetupLanguages().put("spanish", "compiler:Languages\\Spanish.isl"); } doInit(); // removes not necessary platform specific configs - switch (platform) { + switch (task.getPlatform()) { case linux: - macConfig = null; - winConfig = null; + task.macConfig((MacConfig) null); + task.winConfig((WindowsConfig) null); break; case mac: - winConfig = null; - linuxConfig = null; + task.winConfig((WindowsConfig) null); + task.linuxConfig((LinuxConfig) null); break; case windows: - linuxConfig = null; - macConfig = null; + task.linuxConfig((LinuxConfig) null); + task.macConfig((MacConfig) null); break; default: } @@ -180,16 +186,16 @@ public void resolveResources() throws Exception { Logger.infoIndent("Resolving resources ..."); // locates license file - licenseFile = resolveLicense(licenseFile); + task.licenseFile(resolveLicense(task.getLicenseFile())); // locates icon file - iconFile = resolveIcon(iconFile, name, assetsFolder); + task.iconFile(resolveIcon(task.getIconFile(), task.getName(), assetsFolder)); // adds to additional resources - if (additionalResources != null) { - if (licenseFile != null) additionalResources.add(licenseFile); - additionalResources.add(iconFile); - Logger.info("Effective additional resources " + additionalResources); + if (task.getAdditionalResources() != null) { + if (task.getLicenseFile() != null) task.getAdditionalResources().add(task.getLicenseFile()); + task.getAdditionalResources().add(task.getIconFile()); + Logger.info("Effective additional resources " + task.getAdditionalResources()); } Logger.infoUnindent("Resources resolved!"); @@ -224,12 +230,12 @@ protected void copyAdditionalResources(List resources, File destination) { }); // copy bootstrap script - if (FileUtils.exists(getScripts().getBootstrap())) { - String scriptExtension = getExtension(getScripts().getBootstrap().getName()); + if (FileUtils.exists(task.getScripts().getBootstrap())) { + String scriptExtension = getExtension(task.getScripts().getBootstrap().getName()); File scriptsFolder = new File(destination, "scripts"); bootstrapFile = new File(scriptsFolder, "bootstrap" + (!scriptExtension.isEmpty() ? "." + scriptExtension : "")); try { - FileUtils.copyFileToFile(getScripts().getBootstrap(), bootstrapFile); + FileUtils.copyFileToFile(task.getScripts().getBootstrap(), bootstrapFile); bootstrapFile.setExecutable(true, false); } catch (Exception e) { Logger.error(e.getMessage(), e); @@ -291,31 +297,31 @@ protected File resolveLicense(File licenseFile) { protected File resolveIcon(File iconFile, String name, File assetsFolder) throws Exception { // searchs for specific icons - switch (platform) { + switch (task.getPlatform()) { case linux: - iconFile = FileUtils.exists(linuxConfig.getPngFile()) ? linuxConfig.getPngFile() : null; + iconFile = FileUtils.exists(task.getLinuxConfig().getPngFile()) ? task.getLinuxConfig().getPngFile() : null; break; case mac: - iconFile = FileUtils.exists(macConfig.getIcnsFile()) ? macConfig.getIcnsFile() : null; + iconFile = FileUtils.exists(task.getMacConfig().getIcnsFile()) ? task.getMacConfig().getIcnsFile() : null; break; case windows: - iconFile = FileUtils.exists(winConfig.getIcoFile()) ? winConfig.getIcoFile() : null; + iconFile = FileUtils.exists(task.getWinConfig().getIcoFile()) ? task.getWinConfig().getIcoFile() : null; break; default: } - String iconExtension = IconUtils.getIconFileExtensionByPlatform(platform); + String iconExtension = IconUtils.getIconFileExtensionByPlatform(task.getPlatform()); // if not specific icon specified for target platform, searchs for an icon in // "${assetsDir}" folder if (iconFile == null) { - iconFile = new File(assetsDir, platform + "/" + name + iconExtension); + iconFile = new File(task.getAssetsDir(), task.getPlatform() + "/" + name + iconExtension); } // if there's no icon yet, uses default one if (!iconFile.exists()) { iconFile = new File(assetsFolder, iconFile.getName()); - FileUtils.copyResourceToFile("/" + platform + "/default-icon" + iconExtension, iconFile); + FileUtils.copyResourceToFile("/" + task.getPlatform() + "/default-icon" + iconExtension, iconFile); } Logger.info("Icon file resolved: " + iconFile.getAbsolutePath()); @@ -335,13 +341,13 @@ public List createBundles() throws Exception { Logger.infoIndent("Creating bundles ..."); - if (createZipball) { + if (task.getCreateZipball()) { File zipball = Context.getContext().createZipball(this); Logger.info("Zipball created: " + zipball); bundles.add(zipball); } - if (createTarball) { + if (task.getCreateTarball()) { File tarball = Context.getContext().createTarball(this); Logger.info("Tarball created: " + tarball); bundles.add(tarball); @@ -357,21 +363,21 @@ private void createAppStructure() throws Exception { Logger.infoIndent("Creating app structure ..."); // creates output directory if it doesn't exist - if (!outputDirectory.exists()) { - outputDirectory.mkdirs(); + if (!task.getOutputDirectory().exists()) { + task.getOutputDirectory().mkdirs(); } // creates app destination folder - appFolder = new File(outputDirectory, name); + appFolder = new File(task.getOutputDirectory(), task.getName()); if (appFolder.exists()) { FileUtils.removeFolder(appFolder); Logger.info("Old app folder removed " + appFolder.getAbsolutePath()); } - appFolder = FileUtils.mkdir(outputDirectory, name); + appFolder = FileUtils.mkdir(task.getOutputDirectory(), task.getName()); Logger.info("App folder created: " + appFolder.getAbsolutePath()); // creates folder for intermmediate assets - assetsFolder = FileUtils.mkdir(outputDirectory, "assets"); + assetsFolder = FileUtils.mkdir(task.getOutputDirectory(), "assets"); Logger.info("Assets folder created: " + assetsFolder.getAbsolutePath()); // create the rest of the structure @@ -394,17 +400,17 @@ public File createApp() throws Exception { resolveResources(); // copies additional resources - copyAdditionalResources(additionalResources, resourcesDestinationFolder); + copyAdditionalResources(task.getAdditionalResources(), resourcesDestinationFolder); // copies all dependencies to Java folder Logger.infoIndent("Copying all dependencies ..."); - libsFolder = copyDependencies ? Context.getContext().copyDependencies(this) : null; + libsFolder = task.getCopyDependencies() ? Context.getContext().copyDependencies(this) : null; Logger.infoUnindent("Dependencies copied to " + libsFolder + "!"); // creates a runnable jar file - if (runnableJar != null && runnableJar.exists()) { - Logger.info("Using runnable JAR: " + runnableJar); - jarFile = runnableJar; + if (task.getRunnableJar() != null && task.getRunnableJar().exists()) { + Logger.info("Using runnable JAR: " + task.getRunnableJar()); + jarFile = task.getRunnableJar(); } else { Logger.infoIndent("Creating runnable JAR..."); jarFile = Context.getContext().createRunnableJar(this); @@ -424,7 +430,7 @@ public File createApp() throws Exception { public List generateInstallers() throws Exception { List installers = new ArrayList<>(); - if (!generateInstaller) { + if (!task.getGenerateInstaller()) { Logger.warn("Installer generation is disabled by 'generateInstaller' property!"); return installers; } @@ -434,11 +440,11 @@ public List generateInstallers() throws Exception { init(); // creates folder for intermmediate assets if it doesn't exist - assetsFolder = FileUtils.mkdir(outputDirectory, "assets"); + assetsFolder = FileUtils.mkdir(task.getOutputDirectory(), "assets"); // invokes installer producers - for (ArtifactGenerator generator : Context.getContext().getInstallerGenerators(platform)) { + for (ArtifactGenerator generator : Context.getContext().getInstallerGenerators(task.getPlatform())) { try { Logger.infoIndent("Generating " + generator.getArtifactName() + "..."); File artifact = generator.apply(this); diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/WindowsArtifactGenerator.java b/src/main/java/io/github/fvarrui/javapackager/packagers/WindowsArtifactGenerator.java index 56e0bee4..1c27ef40 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/WindowsArtifactGenerator.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/WindowsArtifactGenerator.java @@ -19,23 +19,23 @@ public WindowsArtifactGenerator(String name) { protected void sign(File file, WindowsPackager packager) { - if (packager.getWinConfig().getSigning() == null) { + if (packager.task.getWinConfig().getSigning() == null) { return; } Logger.infoIndent("Signing " + file); - File keystore = packager.getWinConfig().getSigning().getKeystore(); - File certfile = packager.getWinConfig().getSigning().getCertfile(); - File keyfile = packager.getWinConfig().getSigning().getKeyfile(); - String alg = packager.getWinConfig().getSigning().getAlg(); - String storetype = packager.getWinConfig().getSigning().getStoretype(); - String storepass = packager.getWinConfig().getSigning().getStorepass(); - String alias = packager.getWinConfig().getSigning().getAlias(); - String keypass = packager.getWinConfig().getSigning().getKeypass(); + File keystore = packager.task.getWinConfig().getSigning().getKeystore(); + File certfile = packager.task.getWinConfig().getSigning().getCertfile(); + File keyfile = packager.task.getWinConfig().getSigning().getKeyfile(); + String alg = packager.task.getWinConfig().getSigning().getAlg(); + String storetype = packager.task.getWinConfig().getSigning().getStoretype(); + String storepass = packager.task.getWinConfig().getSigning().getStorepass(); + String alias = packager.task.getWinConfig().getSigning().getAlias(); + String keypass = packager.task.getWinConfig().getSigning().getKeypass(); String tsa = TIMESTAMPING_AUTHORITY; - String displayName = packager.getDisplayName(); - String url = packager.getUrl(); + String displayName = packager.task.getDisplayName(); + String url = packager.task.getUrl(); try { diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/WindowsPackager.java b/src/main/java/io/github/fvarrui/javapackager/packagers/WindowsPackager.java index 24b02bca..73b20b1f 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/WindowsPackager.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/WindowsPackager.java @@ -4,6 +4,7 @@ import java.util.Arrays; import java.util.stream.Collectors; +import io.github.fvarrui.javapackager.PackageTask; import org.apache.commons.lang3.StringUtils; import io.github.fvarrui.javapackager.utils.Logger; @@ -16,7 +17,11 @@ public class WindowsPackager extends Packager { private File manifestFile; private File msmFile; - + + public WindowsPackager(PackageTask task) { + super(task); + } + public File getManifestFile() { return manifestFile; } @@ -33,7 +38,7 @@ public void setMsmFile(File msmFile) { public void doInit() throws Exception { // sets windows config default values - this.winConfig.setDefaults(this); + task.getWinConfig().setDefaults(this); } @@ -43,7 +48,7 @@ protected void doCreateAppStructure() throws Exception { // sets common folders this.executableDestinationFolder = appFolder; this.jarFileDestinationFolder = appFolder; - this.jreDestinationFolder = new File(appFolder, jreDirectoryName); + this.jreDestinationFolder = new File(appFolder, task.getJreDirectoryName()); this.resourcesDestinationFolder = appFolder; } @@ -54,23 +59,23 @@ protected void doCreateAppStructure() throws Exception { @Override public File doCreateApp() throws Exception { - Logger.infoIndent("Creating windows EXE ... with " + getWinConfig().getExeCreationTool()); + Logger.infoIndent("Creating windows EXE ... with " + task.getWinConfig().getExeCreationTool()); // generates manifest file to require administrator privileges from velocity template - manifestFile = new File(assetsFolder, name + ".exe.manifest"); + manifestFile = new File(assetsFolder, task.getName() + ".exe.manifest"); VelocityUtils.render("windows/exe.manifest.vtl", manifestFile, this); Logger.info("Exe manifest file generated in " + manifestFile.getAbsolutePath() + "!"); // sets executable file - executable = new File(appFolder, name + ".exe"); + executable = new File(appFolder, task.getName() + ".exe"); // process classpath - if (classpath != null) { - classpaths = Arrays.asList(classpath.split("[;:]")); - if (!isUseResourcesAsWorkingDir()) { + if (task.getClasspath() != null) { + classpaths = Arrays.asList(task.getClasspath().split("[;:]")); + if (!task.isUseResourcesAsWorkingDir()) { classpaths = classpaths.stream().map(cp -> new File(cp).isAbsolute() ? cp : "%EXEDIR%/" + cp).collect(Collectors.toList()); } - classpath = StringUtils.join(classpaths, ";"); + task.classpath(StringUtils.join(classpaths, ";")); } // invokes launch4j to generate windows executable diff --git a/src/test/java/io/github/fvarrui/javapackager/utils/updater/RealTest.java b/src/test/java/io/github/fvarrui/javapackager/utils/updater/RealTest.java index 8cd7abf2..033e7510 100644 --- a/src/test/java/io/github/fvarrui/javapackager/utils/updater/RealTest.java +++ b/src/test/java/io/github/fvarrui/javapackager/utils/updater/RealTest.java @@ -19,7 +19,7 @@ void test() throws Exception { // PUBLISH CURRENT JAVA PACKAGER TO LOCAL MAVEN REPO TO BE USED BY THE HELLO WORLD PROJECTS File gradlew = new File(System.getProperty("user.dir") + "/gradlew" + (Platform.getCurrentPlatform() == Platform.windows ? ".bat" : ".sh")); - if (getBuilder(gradlew.getAbsolutePath(), "build", "publishToMavenLocal", "-x", "test", "-x", "javadoc") + if (getBuilder(gradlew.getAbsolutePath(), "build", "publishToMavenLocal", "-x", "validatePlugins", "-x", "test", "-x", "javadoc", "--stacktrace") .start().waitFor() != 0) throw new Exception("Failed! Exit code is not 0, see details further below:"); diff --git a/test/hello-world-gradle/build.gradle b/test/hello-world-gradle/build.gradle index 9bc1e1c6..bf78618d 100644 --- a/test/hello-world-gradle/build.gradle +++ b/test/hello-world-gradle/build.gradle @@ -20,7 +20,7 @@ dependencies { implementation 'commons-io:commons-io:2.6' } -import io.github.fvarrui.javapackager.gradle.PackageTask; +import io.github.fvarrui.javapackager.PackageTask; import io.github.fvarrui.javapackager.model.*; group = 'io.github.fvarrui' @@ -66,10 +66,6 @@ task packageForWindows(type: PackageTask, dependsOn: build) { } } -taskMyTask(type: MyPackageTask, dependsOn: build){ - getName() { return "name" } -} - task packageForLinux(type: PackageTask, dependsOn: build) { description = 'Packages the application as a native GNU/Linux executable and bundles it in a tarball' platform = 'linux' From c5d5a3087730fe513bce32b397104a42ab175042 Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Thu, 4 Aug 2022 15:22:38 +0200 Subject: [PATCH 29/74] renamed name and display name; and fixed plugin extension --- .../fvarrui/javapackager/PackageTask.java | 38 +++++++++---------- .../gradle/CreateRunnableJar.java | 2 +- .../javapackager/gradle/CreateTarball.java | 2 +- .../javapackager/gradle/CreateZipball.java | 2 +- .../javapackager/gradle/PackagePlugin.java | 15 ++++++-- .../javapackager/maven/CreateRunnableJar.java | 2 +- .../javapackager/maven/CreateTarball.java | 2 +- .../javapackager/maven/CreateZipball.java | 2 +- .../javapackager/model/WindowsConfig.java | 6 +-- .../packagers/AbstractCreateWindowsExe.java | 2 +- .../packagers/CreateWindowsExeWhy.java | 2 +- .../packagers/CreateWindowsExeWinRun4j.java | 2 +- .../packagers/GenerateAppImage.java | 2 +- .../javapackager/packagers/GenerateDeb.java | 2 +- .../javapackager/packagers/GenerateDmg.java | 2 +- .../javapackager/packagers/GenerateMsi.java | 2 +- .../javapackager/packagers/GenerateMsm.java | 2 +- .../javapackager/packagers/GeneratePkg.java | 2 +- .../javapackager/packagers/GenerateRpm.java | 2 +- .../javapackager/packagers/GenerateSetup.java | 2 +- .../javapackager/packagers/LinuxPackager.java | 6 +-- .../javapackager/packagers/MacPackager.java | 2 +- .../javapackager/packagers/Packager.java | 22 +++++------ .../packagers/WindowsArtifactGenerator.java | 2 +- .../packagers/WindowsPackager.java | 4 +- 25 files changed, 68 insertions(+), 61 deletions(-) diff --git a/src/main/java/io/github/fvarrui/javapackager/PackageTask.java b/src/main/java/io/github/fvarrui/javapackager/PackageTask.java index c0bf2828..4ea083ad 100644 --- a/src/main/java/io/github/fvarrui/javapackager/PackageTask.java +++ b/src/main/java/io/github/fvarrui/javapackager/PackageTask.java @@ -57,8 +57,8 @@ public PackageTask() { this.modules = new ArrayList<>(); this.forceInstaller = false; this.mainClass = "${exec.mainClass}"; //TODO gradle? - this.name = (isGradle ? project.getName() : "${project.name}"); - this.displayName = (isGradle ? project.getName() : "${project.name}"); + this.appName = (isGradle ? project.getName() : "${project.name}"); + this.appDisplayName = (isGradle ? project.getName() : "${project.name}"); this.version = (isGradle ? (String) project.getVersion() : "${project.version}"); this.description = (isGradle ? project.getDescription(): "${project.description}"); this.url = "${project.url}"; //TODO gradle? @@ -284,18 +284,18 @@ public Scripts scripts(Closure closure) { /** * App name. */ - @Parameter(property = "name") + @Parameter(property = "appName") @Input @Optional - protected String name ; + protected String appName; /** * App name to show. */ - @Parameter(property = "displayName") + @Parameter(property = "appDisplayName") @Input @Optional - protected String displayName; + protected String appDisplayName; /** * Project version. @@ -656,19 +656,19 @@ public String getMainClass() { } /** - * Get name - * @return Name + * Get app name + * @return App name */ - public String getName() { - return name; + public String getAppName() { + return appName; } /** * Get display name * @return Display name */ - public String getDisplayName() { - return displayName; + public String getAppDisplayName() { + return appDisplayName; } /** @@ -1033,21 +1033,21 @@ public PackageTask mainClass(String mainClass) { /** * Set name - * @param name Name + * @param appName Name * @return Packager settings */ - public PackageTask name(String name) { - this.name = name; + public PackageTask appName(String appName) { + this.appName = appName; return this; } /** * Set display name - * @param displayName Display name + * @param appDisplayName Display name * @return Packager settings */ - public PackageTask displayName(String displayName) { - this.displayName = displayName; + public PackageTask appDisplayName(String appDisplayName) { + this.appDisplayName = appDisplayName; return this; } @@ -1435,7 +1435,7 @@ public String getMimeTypesListAsString(String separator) { public String toString() { return "PackageTask [outputDirectory=" + outputDirectory + ", licenseFile=" + licenseFile + ", iconFile=" + iconFile + ", generateInstaller=" + generateInstaller + ", forceInstaller=" + forceInstaller - + ", mainClass=" + mainClass + ", name=" + name + ", displayName=" + displayName + ", version=" + + ", mainClass=" + mainClass + ", name=" + appName + ", displayName=" + appDisplayName + ", version=" + version + ", description=" + description + ", url=" + url + ", administratorRequired=" + administratorRequired + ", organizationName=" + organizationName + ", organizationUrl=" + organizationUrl + ", organizationEmail=" + organizationEmail + ", bundleJre=" + bundleJre diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/CreateRunnableJar.java b/src/main/java/io/github/fvarrui/javapackager/gradle/CreateRunnableJar.java index f9a6182d..4592a16f 100644 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/CreateRunnableJar.java +++ b/src/main/java/io/github/fvarrui/javapackager/gradle/CreateRunnableJar.java @@ -28,7 +28,7 @@ public CreateRunnableJar() { protected File doApply(Packager packager) { String classifier = "runnable"; - String name = packager.task.getName(); + String name = packager.task.getAppName(); String version = packager.task.getVersion(); String mainClass = packager.task.getMainClass(); File outputDirectory = packager.task.getOutputDirectory(); diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/CreateTarball.java b/src/main/java/io/github/fvarrui/javapackager/gradle/CreateTarball.java index 616f5833..710b5079 100644 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/CreateTarball.java +++ b/src/main/java/io/github/fvarrui/javapackager/gradle/CreateTarball.java @@ -29,7 +29,7 @@ public boolean skip(Packager packager) { @Override protected File doApply(Packager packager) throws Exception { - String name = packager.task.getName(); + String name = packager.task.getAppName(); String version = packager.task.getVersion(); Platform platform = packager.task.getPlatform(); File outputDirectory = packager.task.getOutputDirectory(); diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/CreateZipball.java b/src/main/java/io/github/fvarrui/javapackager/gradle/CreateZipball.java index 97d5e4b7..76079778 100644 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/CreateZipball.java +++ b/src/main/java/io/github/fvarrui/javapackager/gradle/CreateZipball.java @@ -28,7 +28,7 @@ public boolean skip(Packager packager) { @Override protected File doApply(Packager packager) throws Exception { - String name = packager.task.getName(); + String name = packager.task.getAppName(); String version = packager.task.getVersion(); Platform platform = packager.task.getPlatform(); File outputDirectory = packager.task.getOutputDirectory(); diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePlugin.java b/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePlugin.java index c9b2bc62..3c718964 100644 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePlugin.java +++ b/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePlugin.java @@ -5,7 +5,10 @@ import io.github.fvarrui.javapackager.packagers.Context; import org.gradle.api.Plugin; import org.gradle.api.Project; +import org.gradle.api.Task; +import java.lang.reflect.Constructor; +import java.lang.reflect.Parameter; import java.util.UUID; /** @@ -23,13 +26,17 @@ public void apply(Project project) { Context.setContext(new GradleContext(project)); project.getPluginManager().apply("java"); - project.getPluginManager().apply("edu.sc.seis.launch4j"); - - project.getExtensions().create(SETTINGS_EXT_NAME, PackageTask.class, project); - project.getTasks().create(PACKAGE_TASK_NAME, PackageTask.class).dependsOn("build"); + project.getPluginManager().apply("edu.sc.seis.launch4j"); + + PackageTask task = (PackageTask) project.getTasks().create(PACKAGE_TASK_NAME, PackageTask.class).dependsOn("build"); + project.getExtensions().add(SETTINGS_EXT_NAME, task); // Use task instance as extension Context.getGradleContext().setLibraryTask(project.getTasks().create("launch4j_" + UUID.randomUUID(), Launch4jLibraryTask.class)); + System.out.println("TASKS: "+project.getTasks().size()); + for (Task t : project.getTasks()) { + System.out.println("name: "+t.getName()+" desc: "+t.getDescription()); + } } } diff --git a/src/main/java/io/github/fvarrui/javapackager/maven/CreateRunnableJar.java b/src/main/java/io/github/fvarrui/javapackager/maven/CreateRunnableJar.java index f0108a83..d6233df7 100644 --- a/src/main/java/io/github/fvarrui/javapackager/maven/CreateRunnableJar.java +++ b/src/main/java/io/github/fvarrui/javapackager/maven/CreateRunnableJar.java @@ -38,7 +38,7 @@ public CreateRunnableJar() { protected File doApply(Packager packager) { String classifier = "runnable"; - String name = packager.task.getName(); + String name = packager.task.getAppName(); String version = packager.task.getVersion(); String mainClass = packager.task.getMainClass(); File outputDirectory = packager.task.getOutputDirectory(); diff --git a/src/main/java/io/github/fvarrui/javapackager/maven/CreateTarball.java b/src/main/java/io/github/fvarrui/javapackager/maven/CreateTarball.java index 1f76a21d..c149698e 100644 --- a/src/main/java/io/github/fvarrui/javapackager/maven/CreateTarball.java +++ b/src/main/java/io/github/fvarrui/javapackager/maven/CreateTarball.java @@ -35,7 +35,7 @@ public boolean skip(Packager packager) { protected File doApply(Packager packager) { File assetsFolder = packager.getAssetsFolder(); - String name = packager.task.getName(); + String name = packager.task.getAppName(); String version = packager.task.getVersion(); Platform platform = packager.task.getPlatform(); File outputDirectory = packager.task.getOutputDirectory(); diff --git a/src/main/java/io/github/fvarrui/javapackager/maven/CreateZipball.java b/src/main/java/io/github/fvarrui/javapackager/maven/CreateZipball.java index 63cb7e00..1b70ede3 100644 --- a/src/main/java/io/github/fvarrui/javapackager/maven/CreateZipball.java +++ b/src/main/java/io/github/fvarrui/javapackager/maven/CreateZipball.java @@ -35,7 +35,7 @@ public boolean skip(Packager packager) { protected File doApply(Packager packager) { File assetsFolder = packager.getAssetsFolder(); - String name = packager.task.getName(); + String name = packager.task.getAppName(); String version = packager.task.getVersion(); Platform platform = packager.task.getPlatform(); File outputDirectory = packager.task.getOutputDirectory(); diff --git a/src/main/java/io/github/fvarrui/javapackager/model/WindowsConfig.java b/src/main/java/io/github/fvarrui/javapackager/model/WindowsConfig.java index 4c79247a..51b5f0d8 100644 --- a/src/main/java/io/github/fvarrui/javapackager/model/WindowsConfig.java +++ b/src/main/java/io/github/fvarrui/javapackager/model/WindowsConfig.java @@ -335,9 +335,9 @@ public void setDefaults(Packager packager) { this.setCompanyName(defaultIfBlank(this.getCompanyName(), packager.task.getOrganizationName())); this.setCopyright(defaultIfBlank(this.getCopyright(), packager.task.getOrganizationName())); this.setFileDescription(defaultIfBlank(this.getFileDescription(), packager.task.getDescription())); - this.setProductName(defaultIfBlank(this.getProductName(), packager.task.getName())); - this.setInternalName(defaultIfBlank(this.getInternalName(), packager.task.getName())); - this.setOriginalFilename(defaultIfBlank(this.getOriginalFilename(), packager.task.getName() + ".exe")); + this.setProductName(defaultIfBlank(this.getProductName(), packager.task.getAppName())); + this.setInternalName(defaultIfBlank(this.getInternalName(), packager.task.getAppName())); + this.setOriginalFilename(defaultIfBlank(this.getOriginalFilename(), packager.task.getAppName() + ".exe")); this.setMsiUpgradeCode(defaultIfBlank(this.getMsiUpgradeCode(), UUID.randomUUID().toString())); } diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/AbstractCreateWindowsExe.java b/src/main/java/io/github/fvarrui/javapackager/packagers/AbstractCreateWindowsExe.java index 0b365edf..22f5c361 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/AbstractCreateWindowsExe.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/AbstractCreateWindowsExe.java @@ -93,7 +93,7 @@ protected File createBootstrapScript(WindowsPackager packager) throws Exception if (FileUtils.exists(packager.task.getScripts().getBootstrap())) { // generates startup VBS script file - File vbsFile = new File(packager.getAppFolder(), packager.task.getName() + ".vbs"); + File vbsFile = new File(packager.getAppFolder(), packager.task.getAppName() + ".vbs"); VelocityUtils.render(Platform.windows + "/startup.vbs.vtl", vbsFile, packager); executable = vbsFile; diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/CreateWindowsExeWhy.java b/src/main/java/io/github/fvarrui/javapackager/packagers/CreateWindowsExeWhy.java index 7d999476..4875614d 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/CreateWindowsExeWhy.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/CreateWindowsExeWhy.java @@ -32,7 +32,7 @@ public boolean skip(WindowsPackager packager) { @Override protected File doApply(WindowsPackager packager) throws Exception { - String name = packager.task.getName(); + String name = packager.task.getAppName(); File executable = packager.getExecutable(); File manifestFile = packager.getManifestFile(); File iconFile = packager.task.getIconFile(); diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/CreateWindowsExeWinRun4j.java b/src/main/java/io/github/fvarrui/javapackager/packagers/CreateWindowsExeWinRun4j.java index 025d28cb..dbdfd8c1 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/CreateWindowsExeWinRun4j.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/CreateWindowsExeWinRun4j.java @@ -45,7 +45,7 @@ public boolean skip(WindowsPackager packager) { @Override protected File doApply(WindowsPackager packager) throws Exception { - String name = packager.task.getName(); + String name = packager.task.getAppName(); File executable = packager.getExecutable(); File jarFile = packager.getJarFile(); File manifestFile = packager.getManifestFile(); diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateAppImage.java b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateAppImage.java index 60f32fe0..a63bf6bf 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateAppImage.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateAppImage.java @@ -41,7 +41,7 @@ protected File doApply(LinuxPackager packager) throws Exception { File appFolder = packager.getAppFolder(); File outputFolder = packager.task.getOutputDirectory(); - String name = packager.task.getName(); + String name = packager.task.getAppName(); File executable = packager.getExecutable(); File assetsFolder = packager.getAssetsFolder(); File iconFile = packager.task.getIconFile(); diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateDeb.java b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateDeb.java index 6c72f880..3667eee6 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateDeb.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateDeb.java @@ -55,7 +55,7 @@ public boolean skip(LinuxPackager packager) { protected File doApply(LinuxPackager packager) throws Exception { File assetsFolder = packager.getAssetsFolder(); - String name = packager.task.getName(); + String name = packager.task.getAppName(); File appFolder = packager.getAppFolder(); File outputDirectory = packager.task.getOutputDirectory(); String version = packager.task.getVersion(); diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateDmg.java b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateDmg.java index a867aa69..7910ba8f 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateDmg.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateDmg.java @@ -45,7 +45,7 @@ protected File doApply(MacPackager packager) throws Exception { File appFolder = packager.getAppFolder(); File assetsFolder = packager.getAssetsFolder(); - String name = packager.task.getName(); + String name = packager.task.getAppName(); File outputDirectory = packager.task.getOutputDirectory(); File iconFile = packager.task.getIconFile(); String version = packager.task.getVersion(); diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateMsi.java b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateMsi.java index fc4d72f6..3ac3e134 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateMsi.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateMsi.java @@ -41,7 +41,7 @@ protected File doApply(WindowsPackager packager) throws Exception { Logger.info("MSM file generated in " + msmFile); File assetsFolder = packager.getAssetsFolder(); - String name = packager.task.getName(); + String name = packager.task.getAppName(); File outputDirectory = packager.task.getOutputDirectory(); String version = packager.task.getVersion(); diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateMsm.java b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateMsm.java index 8bef27ec..01c40bea 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateMsm.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateMsm.java @@ -41,7 +41,7 @@ protected File doApply(WindowsPackager packager) throws Exception { } File assetsFolder = packager.getAssetsFolder(); - String name = packager.task.getName(); + String name = packager.task.getAppName(); File outputDirectory = packager.task.getOutputDirectory(); String version = packager.task.getVersion(); diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/GeneratePkg.java b/src/main/java/io/github/fvarrui/javapackager/packagers/GeneratePkg.java index 312901de..0113f3aa 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/GeneratePkg.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/GeneratePkg.java @@ -35,7 +35,7 @@ public boolean skip(MacPackager packager) { protected File doApply(MacPackager packager) throws Exception { File appFile = packager.getAppFile(); - String name = packager.task.getName(); + String name = packager.task.getAppName(); File outputDirectory = packager.task.getOutputDirectory(); String version = packager.task.getVersion(); diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateRpm.java b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateRpm.java index 00f0be5d..45d85b19 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateRpm.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateRpm.java @@ -34,7 +34,7 @@ public boolean skip(LinuxPackager packager) { protected File doApply(LinuxPackager packager) throws Exception { File appFolder = packager.getAppFolder(); - String name = packager.task.getName(); + String name = packager.task.getAppName(); String version = packager.task.getVersion().replaceAll("-", "_"); String description = packager.task.getDescription(); String organizationName = packager.task.getOrganizationName(); diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateSetup.java b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateSetup.java index 888d4a55..9977ccd2 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateSetup.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/GenerateSetup.java @@ -41,7 +41,7 @@ protected File doApply(WindowsPackager packager) throws Exception { File iconFile = packager.task.getIconFile(); File assetsFolder = packager.getAssetsFolder(); - String name = packager.task.getName(); + String name = packager.task.getAppName(); File outputDirectory = packager.task.getOutputDirectory(); String version = packager.task.getVersion(); Registry registry = packager.task.getWinConfig().getRegistry(); diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/LinuxPackager.java b/src/main/java/io/github/fvarrui/javapackager/packagers/LinuxPackager.java index 804918d0..e095f083 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/LinuxPackager.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/LinuxPackager.java @@ -61,7 +61,7 @@ public File doCreateApp() throws Exception { Logger.infoIndent("Creating GNU/Linux executable ..."); // sets executable file - this.executable = new File(appFolder, task.getName()); + this.executable = new File(appFolder, task.getAppName()); // process classpath if (task.getClasspath() != null) { @@ -73,13 +73,13 @@ public File doCreateApp() throws Exception { } // generates desktop file from velocity template - desktopFile = new File(assetsFolder, task.getName() + ".desktop"); + desktopFile = new File(assetsFolder, task.getAppName() + ".desktop"); VelocityUtils.render("linux/desktop.vtl", desktopFile, this); Logger.info("Rendering desktop file to " + desktopFile.getAbsolutePath()); // generates mime.xml file from velocity template if (task.isThereFileAssociations()) { - mimeXmlFile = new File(assetsFolder, task.getName() + ".xml"); + mimeXmlFile = new File(assetsFolder, task.getAppName() + ".xml"); VelocityUtils.render("linux/mime.xml.vtl", mimeXmlFile, this); Logger.info("Rendering mime.xml file to " + mimeXmlFile.getAbsolutePath()); } diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java b/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java index ddf4f858..6b1982e4 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java @@ -56,7 +56,7 @@ public void doInit() throws Exception { protected void doCreateAppStructure() throws Exception { // initializes the references to the app structure folders - this.appFile = new File(appFolder, task.getName() + ".app"); + this.appFile = new File(appFolder, task.getAppName() + ".app"); this.contentsFolder = new File(appFile, "Contents"); this.resourcesFolder = new File(contentsFolder, "Resources"); this.javaFolder = new File(resourcesFolder, this.task.getMacConfig().isRelocateJar() ? "Java" : ""); diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/Packager.java b/src/main/java/io/github/fvarrui/javapackager/packagers/Packager.java index 57df367a..7db6d6de 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/Packager.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/Packager.java @@ -113,10 +113,10 @@ private void init() throws Exception { VelocityUtils.setAssetsDir(task.getAssetsDir()); // using name as displayName, if it's not specified - task.displayName(defaultIfBlank(task.getDisplayName(), task.getName())); + task.appDisplayName(defaultIfBlank(task.getAppDisplayName(), task.getAppName())); // using displayName as description, if it's not specified - task.description(defaultIfBlank(task.getDescription(), task.getDisplayName())); + task.description(defaultIfBlank(task.getDescription(), task.getAppDisplayName())); // using "ACME" as organizationName, if it's not specified task.organizationName(defaultIfBlank(task.getOrganizationName(), DEFAULT_ORGANIZATION_NAME)); @@ -141,13 +141,13 @@ private void init() throws Exception { // check if name is valid as filename try { - Paths.get(task.getName()); - if (task.getName().contains("/")) - throw new InvalidPathException(task.getName(), "Illegal char "); - if (task.getName().contains("\\")) - throw new InvalidPathException(task.getName(), "Illegal char <\\>"); + Paths.get(task.getAppName()); + if (task.getAppName().contains("/")) + throw new InvalidPathException(task.getAppName(), "Illegal char "); + if (task.getAppName().contains("\\")) + throw new InvalidPathException(task.getAppName(), "Illegal char <\\>"); } catch (InvalidPathException e) { - throw new Exception("Invalid name specified: " + task.getName(), e); + throw new Exception("Invalid name specified: " + task.getAppName(), e); } // init setup languages @@ -189,7 +189,7 @@ public void resolveResources() throws Exception { task.licenseFile(resolveLicense(task.getLicenseFile())); // locates icon file - task.iconFile(resolveIcon(task.getIconFile(), task.getName(), assetsFolder)); + task.iconFile(resolveIcon(task.getIconFile(), task.getAppName(), assetsFolder)); // adds to additional resources if (task.getAdditionalResources() != null) { @@ -368,12 +368,12 @@ private void createAppStructure() throws Exception { } // creates app destination folder - appFolder = new File(task.getOutputDirectory(), task.getName()); + appFolder = new File(task.getOutputDirectory(), task.getAppName()); if (appFolder.exists()) { FileUtils.removeFolder(appFolder); Logger.info("Old app folder removed " + appFolder.getAbsolutePath()); } - appFolder = FileUtils.mkdir(task.getOutputDirectory(), task.getName()); + appFolder = FileUtils.mkdir(task.getOutputDirectory(), task.getAppName()); Logger.info("App folder created: " + appFolder.getAbsolutePath()); // creates folder for intermmediate assets diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/WindowsArtifactGenerator.java b/src/main/java/io/github/fvarrui/javapackager/packagers/WindowsArtifactGenerator.java index 1c27ef40..244bbef9 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/WindowsArtifactGenerator.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/WindowsArtifactGenerator.java @@ -34,7 +34,7 @@ protected void sign(File file, WindowsPackager packager) { String alias = packager.task.getWinConfig().getSigning().getAlias(); String keypass = packager.task.getWinConfig().getSigning().getKeypass(); String tsa = TIMESTAMPING_AUTHORITY; - String displayName = packager.task.getDisplayName(); + String displayName = packager.task.getAppDisplayName(); String url = packager.task.getUrl(); try { diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/WindowsPackager.java b/src/main/java/io/github/fvarrui/javapackager/packagers/WindowsPackager.java index 73b20b1f..2cb17a8b 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/WindowsPackager.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/WindowsPackager.java @@ -62,12 +62,12 @@ public File doCreateApp() throws Exception { Logger.infoIndent("Creating windows EXE ... with " + task.getWinConfig().getExeCreationTool()); // generates manifest file to require administrator privileges from velocity template - manifestFile = new File(assetsFolder, task.getName() + ".exe.manifest"); + manifestFile = new File(assetsFolder, task.getAppName() + ".exe.manifest"); VelocityUtils.render("windows/exe.manifest.vtl", manifestFile, this); Logger.info("Exe manifest file generated in " + manifestFile.getAbsolutePath() + "!"); // sets executable file - executable = new File(appFolder, task.getName() + ".exe"); + executable = new File(appFolder, task.getAppName() + ".exe"); // process classpath if (task.getClasspath() != null) { From 3a8878bf35266d9e1d249836e05533fc278f73e3 Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Thu, 4 Aug 2022 16:18:13 +0200 Subject: [PATCH 30/74] updated docs and readme --- README.md | 6 ++++-- docs/gradle/plugin-configuration-samples.md | 6 +----- docs/maven/plugin-configuration-samples.md | 6 +----- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 6f8e9e0b..2b06431c 100644 --- a/README.md +++ b/README.md @@ -162,7 +162,9 @@ By default it will generate next artifacts in `${outputDirectory} ` folder: | `fileAssociations` | :x: | [`FileAssociation[]`](https://github.com/fvarrui/JavaPackager/blob/master/src/main/java/io/github/fvarrui/javapackager/model/FileAssociation.java) | Associate file extensions or MIME types to the app. | | `forceInstaller` | :x: | `false` | If `true`, skips operating system check when generating installers. | | `generateInstaller` | :x: | `true` | Generates an installer for the app. | -| `jdkPath` | :x: | `${java.home}` | JDK used to generate a customized JRE. It allows to bundle customized JREs for different platforms. | +| `jdkVersion` | :x: | `8` | JDK version to download and use. | +| `jdkVendor` | :x: | `adoptium` | JDK vendor to download the JDK from. Currently supported: `adoptium` | +| `jdkPath` | :x: | `null` | If null downloads (if necessary and also updates it if needed) the right JDK for the selected platform and sets this value to `/jdk/win` or `/jdk/linux` or `/jdk/mac`. The downloaded JDK will be used to generate a customized JRE. | | `jreDirectoryName` | :x: | `"jre"` | Bundled JRE directory name. | | `jreMinVersion` | :x: | | JRE minimum version. If an appropriate version cannot be found display error message. Disabled if a JRE is bundled. | | `jrePath` | :x: | `""` | Path to JRE folder. If specified, it will bundle this JRE with the app, and won't generate a customized JRE. For Java 8 version or least. | @@ -170,7 +172,7 @@ By default it will generate next artifacts in `${outputDirectory} ` folder: | `mainClass` | :heavy_check_mark: | `${exec.mainClass}` | Full path to your app main class. | | `manifest` | :x: | | [Allows adding additional entries to MANIFEST.MF file.](docs/manifest.md) | | `modules` | :x: | `[]` | Modules to customize the bundled JRE. Don't use `jdeps` to get module dependencies. | -| `name` | :x: | `${project.name}` or `${project.artifactId}` | App name. | +| `appName` | :x: | `${project.name}` or `${project.artifactId}` | App name. | | `organizationName` | :x: | `${project.organization.name}` or `"ACME"` | Organization name. | | `organizationUrl` | :x: | `${project.organization.url}` | Organization website URL. | | `organizationEmail` | :x: | | Organization email. | diff --git a/docs/gradle/plugin-configuration-samples.md b/docs/gradle/plugin-configuration-samples.md index 65aa30c8..2b2be886 100644 --- a/docs/gradle/plugin-configuration-samples.md +++ b/docs/gradle/plugin-configuration-samples.md @@ -103,12 +103,10 @@ javapackager { task packageMyAppForLinux(type: io.github.fvarrui.javapackager.gradle.PackageTask, dependsOn: build) { platform = linux createTarball = true - jdkPath = file('X:\\path\to\linux\jdk') } task packageMyAppForMac(type: io.github.fvarrui.javapackager.gradle.PackageTask, dependsOn: build) { platform = mac createTarball = true - jdkPath = file('X:\\path\to\mac\jdk') } task packageMyAppForWindows(type: io.github.fvarrui.javapackager.gradle.PackageTask, dependsOn: build) { platform = windows @@ -121,6 +119,4 @@ E.g. on Windows, running `packageMyApp` task will generate next artifacts: * `${name}_${version}-linux.tar.gz` with the GNU/Linux application including a customized JRE. * `${name}_${version}-mac.tar.gz` with the Mac OS X application including a customized JRE. -* `${name}_${version}-windows.zip` with the Windows application including a customized JRE. - -As last sample is running on Windows, it's not necessary to specify a JDK when bundling for Windows (it uses current JDK by default). Otherwise, if running on GNU/Linux or Mac OS X, you have to specify a JDK for Windows. +* `${name}_${version}-windows.zip` with the Windows application including a customized JRE. \ No newline at end of file diff --git a/docs/maven/plugin-configuration-samples.md b/docs/maven/plugin-configuration-samples.md index fc4a1cfd..066df976 100644 --- a/docs/maven/plugin-configuration-samples.md +++ b/docs/maven/plugin-configuration-samples.md @@ -199,7 +199,6 @@ E.g. on Windows, last configuration will generate next artifacts: linux true - X:\\path\to\linux\jdk @@ -211,7 +210,6 @@ E.g. on Windows, last configuration will generate next artifacts: mac true - X:\\path\to\mac\jdk @@ -222,6 +220,4 @@ E.g. on Windows, last configuration will generate next artifacts: * `${name}_${version}-linux.tar.gz` with the GNU/Linux application including a customized JRE. * `${name}_${version}-mac.tar.gz` with the Mac OS X application including a customized JRE. -* `${name}_${version}-windows.zip` with the Windows application including a customized JRE. - -As last sample is running on Windows, it's not necessary to specify a JDK when bundling for Windows (it uses current JDK by default). Otherwise, if running on GNU/Linux or Mac OS X, you have to specify a JDK for Windows. \ No newline at end of file +* `${name}_${version}-windows.zip` with the Windows application including a customized JRE. \ No newline at end of file From 8e323a3f9c590fe9a6bf9cba39f7922417707431 Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Thu, 4 Aug 2022 16:36:24 +0200 Subject: [PATCH 31/74] removed it folder --- src/it/settings.xml | 47 ---------------------------------- src/it/simple-it/pom.xml | 34 ------------------------ src/it/simple-it/verify.groovy | 3 --- 3 files changed, 84 deletions(-) delete mode 100644 src/it/settings.xml delete mode 100644 src/it/simple-it/pom.xml delete mode 100644 src/it/simple-it/verify.groovy diff --git a/src/it/settings.xml b/src/it/settings.xml deleted file mode 100644 index 66c9e25d..00000000 --- a/src/it/settings.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - it-repo - - true - - - - local.central - @localRepositoryUrl@ - - true - - - true - - - - - - local.central - @localRepositoryUrl@ - - true - - - true - - - - - - diff --git a/src/it/simple-it/pom.xml b/src/it/simple-it/pom.xml deleted file mode 100644 index 0057fbd3..00000000 --- a/src/it/simple-it/pom.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - 4.0.0 - - fvarrui.maven.it - simple-it - 1.0-SNAPSHOT - - A simple IT verifying the basic use case. - - - UTF-8 - - - - - - @project.groupId@ - @project.artifactId@ - @project.version@ - - - touch - validate - - touch - - - - - - - diff --git a/src/it/simple-it/verify.groovy b/src/it/simple-it/verify.groovy deleted file mode 100644 index 7b307c78..00000000 --- a/src/it/simple-it/verify.groovy +++ /dev/null @@ -1,3 +0,0 @@ -File touchFile = new File( basedir, "target/touch.txt" ); - -assert touchFile.isFile() From f7aea3aec63c80a39eda10268cfe32bb6813d396 Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Thu, 4 Aug 2022 20:42:00 +0200 Subject: [PATCH 32/74] update to java 17 --- README.md | 2 +- src/main/java/io/github/fvarrui/javapackager/PackageTask.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2b06431c..b0bf6d2f 100644 --- a/README.md +++ b/README.md @@ -162,7 +162,7 @@ By default it will generate next artifacts in `${outputDirectory} ` folder: | `fileAssociations` | :x: | [`FileAssociation[]`](https://github.com/fvarrui/JavaPackager/blob/master/src/main/java/io/github/fvarrui/javapackager/model/FileAssociation.java) | Associate file extensions or MIME types to the app. | | `forceInstaller` | :x: | `false` | If `true`, skips operating system check when generating installers. | | `generateInstaller` | :x: | `true` | Generates an installer for the app. | -| `jdkVersion` | :x: | `8` | JDK version to download and use. | +| `jdkVersion` | :x: | `17` | JDK version to download and use. | | `jdkVendor` | :x: | `adoptium` | JDK vendor to download the JDK from. Currently supported: `adoptium` | | `jdkPath` | :x: | `null` | If null downloads (if necessary and also updates it if needed) the right JDK for the selected platform and sets this value to `/jdk/win` or `/jdk/linux` or `/jdk/mac`. The downloaded JDK will be used to generate a customized JRE. | | `jreDirectoryName` | :x: | `"jre"` | Bundled JRE directory name. | diff --git a/src/main/java/io/github/fvarrui/javapackager/PackageTask.java b/src/main/java/io/github/fvarrui/javapackager/PackageTask.java index 4ea083ad..fd2e52e0 100644 --- a/src/main/java/io/github/fvarrui/javapackager/PackageTask.java +++ b/src/main/java/io/github/fvarrui/javapackager/PackageTask.java @@ -70,7 +70,7 @@ public PackageTask() { this.customizedJre = true; this.jrePath = null; this.jdkPath = null; - this.jdkVersion = "8"; + this.jdkVersion = "17"; this.jdkVendor = "adoptium"; this.additionalResources = new ArrayList<>(); this.modules = new ArrayList<>(); From 349088cbfb8bf7d3a08818ec948651cb4a8e5f6e Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Thu, 4 Aug 2022 20:49:07 +0200 Subject: [PATCH 33/74] updated jdk id --- README.md | 2 +- .../utils/updater/TaskJavaUpdater.java | 24 +++++++++++-------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index b0bf6d2f..4755780e 100644 --- a/README.md +++ b/README.md @@ -162,7 +162,7 @@ By default it will generate next artifacts in `${outputDirectory} ` folder: | `fileAssociations` | :x: | [`FileAssociation[]`](https://github.com/fvarrui/JavaPackager/blob/master/src/main/java/io/github/fvarrui/javapackager/model/FileAssociation.java) | Associate file extensions or MIME types to the app. | | `forceInstaller` | :x: | `false` | If `true`, skips operating system check when generating installers. | | `generateInstaller` | :x: | `true` | Generates an installer for the app. | -| `jdkVersion` | :x: | `17` | JDK version to download and use. | +| `jdkVersion` | :x: | `17` | JDK version to download and use. | | `jdkVendor` | :x: | `adoptium` | JDK vendor to download the JDK from. Currently supported: `adoptium` | | `jdkPath` | :x: | `null` | If null downloads (if necessary and also updates it if needed) the right JDK for the selected platform and sets this value to `/jdk/win` or `/jdk/linux` or `/jdk/mac`. The downloaded JDK will be used to generate a customized JRE. | | `jreDirectoryName` | :x: | `"jre"` | Bundled JRE directory name. | diff --git a/src/main/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdater.java b/src/main/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdater.java index 8652fff2..84b3ed34 100644 --- a/src/main/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdater.java +++ b/src/main/java/io/github/fvarrui/javapackager/utils/updater/TaskJavaUpdater.java @@ -23,9 +23,7 @@ import java.io.File; import java.io.IOException; -import java.util.Arrays; import java.util.Objects; -import java.util.Properties; /** * Searches for updates and installs them is AUTOMATIC profile is selected. @@ -55,6 +53,8 @@ public TaskJavaUpdater(Platform platform) { jdkPath.mkdirs(); } + private String javaVersion, javaVendor; + public void execute(String javaVersion, String javaVendor) throws Exception { Objects.requireNonNull(javaVersion); Objects.requireNonNull(javaVendor); @@ -62,7 +62,7 @@ public void execute(String javaVersion, String javaVendor) throws Exception { Logger.info("Checking java installation..."); AdoptV3API.OperatingSystemArchitectureType osArchitectureType = AdoptV3API.OperatingSystemArchitectureType.X64; boolean isLargeHeapSize = false; - int currentBuildId = getBuildID(); + int currentBuildId = getBuildID(javaVersion, javaVendor); AdoptV3API.ImageType imageType = AdoptV3API.ImageType.JDK; JsonObject jsonReleases = new AdoptV3API().getReleases( @@ -149,7 +149,7 @@ public void execute(String javaVersion, String javaVendor) throws Exception { // Extracts to /jdk8+189 thus we need to move its content to its parent dir archiver.extract(download.getNewCacheDest(), final_dir_dest); - setBuildID(latestBuildId); + setBuildID(latestBuildId, javaVersion, javaVendor); File actualJdkPath = null; for (File file : jdkPath.listFiles()) { if(file.isDirectory()){ @@ -165,23 +165,27 @@ public void execute(String javaVersion, String javaVendor) throws Exception { Logger.info("Java update was installed successfully (" + currentBuildId + " -> " + latestBuildId + ") at "+jdkPath); } - private int getBuildID() throws IOException { + private String getFileNameWithoutID(String javaVersion, String javaVendor){ + return "java_packager_jdk_"+javaVersion+"_"+javaVendor+"_build_id"; + } + + private int getBuildID(String javaVersion, String javaVendor) throws IOException { for (File file : jdkPath.listFiles()) { - if(file.getName().startsWith("java_packager_build_id ")){ + if(file.getName().startsWith(getFileNameWithoutID(javaVersion, javaVendor))){ return Integer.parseInt(file.getName().split(" ")[1]); } } - setBuildID(0); + setBuildID(0, javaVersion, javaVendor); return 0; } - private void setBuildID(int id) throws IOException { + private void setBuildID(int id, String javaVersion, String javaVendor) throws IOException { for (File file : jdkPath.listFiles()) { - if(file.getName().startsWith("java_packager_build_id ")){ + if(file.getName().startsWith(getFileNameWithoutID(javaVersion, javaVendor))){ file.delete(); } } - File file = new File(jdkPath+"/java_packager_build_id "+id); + File file = new File(jdkPath+"/"+getFileNameWithoutID(javaVersion, javaVendor)+" "+id); file.createNewFile(); } From ff71bf07a0ea4ea37c35efa4ed1dff5dcff5d48c Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Thu, 4 Aug 2022 21:03:25 +0200 Subject: [PATCH 34/74] fixed packagingJdk path not getting set --- README.md | 2 +- src/main/java/io/github/fvarrui/javapackager/PackageTask.java | 2 +- .../java/io/github/fvarrui/javapackager/packagers/Packager.java | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4755780e..a7a322e2 100644 --- a/README.md +++ b/README.md @@ -177,7 +177,7 @@ By default it will generate next artifacts in `${outputDirectory} ` folder: | `organizationUrl` | :x: | `${project.organization.url}` | Organization website URL. | | `organizationEmail` | :x: | | Organization email. | | `outputDirectory` | :x: | `${project.build.directory}` or `${project.builddir}` | Output directory (where the artifacts will be generated). | -| `packagingJdk` | :x: | `${java.home}` | JDK used in the execution of `jlink` and other JDK tools. | +| `packagingJdk` | :x: | `null` or same as `jdkPath` | JDK used in the execution of `jlink` and other JDK tools. If null `jdkPath` will be used. | | `platform` | :x: | `auto` | Defines the target platform, which could be different to the execution platform. Possible values: `auto`, `mac`, `linux`, `windows`. Use `auto` for using execution platform as target. | | `runnableJar` | :x: | | Defines your own JAR file to be bundled. If it's ommited, the plugin packages your code in a runnable JAR and bundle it with the app. | | `scripts` | :x: | | Specify bootstrap script. **Pre and post-install scripts comming soon!** | diff --git a/src/main/java/io/github/fvarrui/javapackager/PackageTask.java b/src/main/java/io/github/fvarrui/javapackager/PackageTask.java index fd2e52e0..ba9a6288 100644 --- a/src/main/java/io/github/fvarrui/javapackager/PackageTask.java +++ b/src/main/java/io/github/fvarrui/javapackager/PackageTask.java @@ -93,7 +93,7 @@ public PackageTask() { manifest(new Manifest()); this.additionalModulePaths = new ArrayList<>(); this.fileAssociations = null; - this.packagingJdk = (isGradle ? null : new File("${java.home}")); // todo gradle + this.packagingJdk = null; scripts(new Scripts()); } diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/Packager.java b/src/main/java/io/github/fvarrui/javapackager/packagers/Packager.java index 7db6d6de..1dbf3008 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/Packager.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/Packager.java @@ -134,6 +134,7 @@ private void init() throws Exception { TaskJavaUpdater taskJavaUpdater = new TaskJavaUpdater(task.getPlatform()); taskJavaUpdater.execute(task.getJdkVersion(), task.getJdkVendor()); task.jdkPath(taskJavaUpdater.jdkPath); + if(task.getPackagingJdk() == null) task.packagingJdk(taskJavaUpdater.jdkPath); } if (!task.getJdkPath().exists()) { throw new Exception("JDK path doesn't exist: " + task.getJdkPath()); From 8ff3b08ab5e2cdfab54a0a11d6bd69576deab3ba Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Thu, 4 Aug 2022 22:00:15 +0200 Subject: [PATCH 35/74] fix maven java home and version issues --- .../javapackager/utils/updater/RealTest.java | 26 ++++++++++++++----- test/hello-world-maven/pom.xml | 1 - 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/test/java/io/github/fvarrui/javapackager/utils/updater/RealTest.java b/src/test/java/io/github/fvarrui/javapackager/utils/updater/RealTest.java index 033e7510..6aa9001f 100644 --- a/src/test/java/io/github/fvarrui/javapackager/utils/updater/RealTest.java +++ b/src/test/java/io/github/fvarrui/javapackager/utils/updater/RealTest.java @@ -1,10 +1,7 @@ package io.github.fvarrui.javapackager.utils.updater; import io.github.fvarrui.javapackager.model.Platform; -import org.apache.maven.shared.invoker.DefaultInvocationRequest; -import org.apache.maven.shared.invoker.DefaultInvoker; -import org.apache.maven.shared.invoker.InvocationRequest; -import org.apache.maven.shared.invoker.Invoker; +import org.apache.maven.shared.invoker.*; import org.junit.jupiter.api.Test; import java.io.File; @@ -32,10 +29,27 @@ void test() throws Exception { // PACKAGE MAVEN HELLO WORLD WITH CURRENT JAVA PACKAGER InvocationRequest request = new DefaultInvocationRequest(); + request.setMavenHome(findMavenHome()); + request.setJavaHome(new File(System.getProperty("java.home"))); request.setPomFile(new File(System.getProperty("user.dir") + "/test/hello-world-maven/pom.xml")); - request.setGoals(Arrays.asList("clean", "package", "-Dmaven.javadoc.skip=true", "-Dmaven.test.skip=true")); + request.setGoals(Arrays.asList("clean", "package")); + request.addArg("-Dmaven.javadoc.skip=true"); + request.addArg("-Dmaven.test.skip=true"); Invoker invoker = new DefaultInvoker(); - invoker.execute(request); + InvocationResult result = invoker.execute(request); + if(result.getExitCode() != 0 || result.getExecutionException() != null) + throw new RuntimeException("Maven exit code != 0, see the cause below for details.", result.getExecutionException()); + } + + private File findMavenHome() { + File startDir; + if(Platform.getCurrentPlatform() == Platform.windows){ + startDir = new File(System.getProperty("user.home") + "\\.m2\\wrapper\\dists"); + return startDir.listFiles()[0].listFiles()[0].listFiles()[0]; + } else{ // LINUX OR MAC + // TODO + throw new RuntimeException("Failed to determine maven home folder! Linux is currently not supported."); + } } private ProcessBuilder getBuilder(String... arguments) throws IOException { diff --git a/test/hello-world-maven/pom.xml b/test/hello-world-maven/pom.xml index bdb4b00a..0c0b9e73 100644 --- a/test/hello-world-maven/pom.xml +++ b/test/hello-world-maven/pom.xml @@ -66,7 +66,6 @@ io.github.fvarrui javapackager - LATEST package From 861d3f28a64d28bbf30766bad1b21ead7693b40c Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Thu, 4 Aug 2022 22:00:48 +0200 Subject: [PATCH 36/74] fix maven java home and version issues --- test/hello-world-maven/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/test/hello-world-maven/pom.xml b/test/hello-world-maven/pom.xml index 0c0b9e73..cb8f8f5f 100644 --- a/test/hello-world-maven/pom.xml +++ b/test/hello-world-maven/pom.xml @@ -66,6 +66,7 @@ io.github.fvarrui javapackager + package From 516b1986269f115d282882db050a817f423abfec Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Thu, 4 Aug 2022 22:14:28 +0200 Subject: [PATCH 37/74] enhanced tests --- .../javapackager/utils/updater/RealTest.java | 47 +++++++++++++------ 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/src/test/java/io/github/fvarrui/javapackager/utils/updater/RealTest.java b/src/test/java/io/github/fvarrui/javapackager/utils/updater/RealTest.java index 6aa9001f..f1863125 100644 --- a/src/test/java/io/github/fvarrui/javapackager/utils/updater/RealTest.java +++ b/src/test/java/io/github/fvarrui/javapackager/utils/updater/RealTest.java @@ -10,23 +10,16 @@ import java.util.Map; public class RealTest { - @Test - void test() throws Exception { - - // PUBLISH CURRENT JAVA PACKAGER TO LOCAL MAVEN REPO TO BE USED BY THE HELLO WORLD PROJECTS - File gradlew = new File(System.getProperty("user.dir") + - "/gradlew" + (Platform.getCurrentPlatform() == Platform.windows ? ".bat" : ".sh")); - if (getBuilder(gradlew.getAbsolutePath(), "build", "publishToMavenLocal", "-x", "validatePlugins", "-x", "test", "-x", "javadoc", "--stacktrace") - .start().waitFor() - != 0) throw new Exception("Failed! Exit code is not 0, see details further below:"); - // PACKAGE GRADLE HELLO WORLD WITH CURRENT JAVA PACKAGER - if (getBuilder(gradlew.getAbsolutePath(), - "clean", "package", "-x", "test", "-x", "javadoc", "--stacktrace") - .directory(new File(System.getProperty("user.dir") + "/test/hello-world-gradle")) - .inheritIO().start().waitFor() - != 0) throw new Exception("Failed! Exit code is not 0, see details further below:"); + @Test + void testMavenAndGradle() throws Exception { + testMaven(); + testGradle(); + } + @Test + void testMaven() throws Exception { + publishPluginLocally(); // PACKAGE MAVEN HELLO WORLD WITH CURRENT JAVA PACKAGER InvocationRequest request = new DefaultInvocationRequest(); request.setMavenHome(findMavenHome()); @@ -41,6 +34,30 @@ void test() throws Exception { throw new RuntimeException("Maven exit code != 0, see the cause below for details.", result.getExecutionException()); } + @Test + void testGradle() throws Exception { + publishPluginLocally(); + // PACKAGE GRADLE HELLO WORLD WITH CURRENT JAVA PACKAGER + if (getBuilder(getGradlew().getAbsolutePath(), + "clean", "package", "-x", "test", "-x", "javadoc", "--stacktrace") + .directory(new File(System.getProperty("user.dir") + "/test/hello-world-gradle")) + .inheritIO().start().waitFor() + != 0) throw new Exception("Failed! Exit code is not 0, see details further below:"); + } + + @Test + void publishPluginLocally() throws Exception { + // PUBLISH CURRENT JAVA PACKAGER TO LOCAL MAVEN REPO TO BE USED BY THE HELLO WORLD PROJECTS + if (getBuilder(getGradlew().getAbsolutePath(), "build", "publishToMavenLocal", "-x", "validatePlugins", "-x", "test", "-x", "javadoc", "--stacktrace") + .start().waitFor() + != 0) throw new Exception("Failed! Exit code is not 0, see details further below:"); + } + + private File getGradlew(){ + return new File(System.getProperty("user.dir") + + "/gradlew" + (Platform.getCurrentPlatform() == Platform.windows ? ".bat" : ".sh")); + } + private File findMavenHome() { File startDir; if(Platform.getCurrentPlatform() == Platform.windows){ From 40d7d67bbb75b28899fc667a1828ebec2aed4e55 Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Fri, 5 Aug 2022 17:34:17 +0200 Subject: [PATCH 38/74] maven is pain... --- build.gradle | 24 ++-- .../io/github/fvarrui/javapackager/Main.java | 112 ++++++++++++++++++ .../fvarrui/javapackager/PackageTask.java | 28 ++--- .../javapackager/utils/updater/RealTest.java | 10 +- test/hello-world-maven/pom.xml | 12 -- 5 files changed, 142 insertions(+), 44 deletions(-) create mode 100644 src/main/java/io/github/fvarrui/javapackager/Main.java diff --git a/build.gradle b/build.gradle index 77e4da16..42abe1d2 100644 --- a/build.gradle +++ b/build.gradle @@ -7,12 +7,13 @@ plugins { id 'io.codearte.nexus-staging' version '0.21.2' id 'eclipse' id 'de.undercouch.download' version '5.0.4' + id 'com.github.johnrengelman.shadow' version '6.1.0' } repositories { mavenLocal() mavenCentral() - maven { + maven { url 'https://plugins.gradle.org/m2/' } maven { url 'https://jitpack.io' } @@ -43,14 +44,9 @@ configurations { mavenEmbedder } -configurations { - // Makes sure that the right dependency gets taken. Author: https://stackoverflow.com/questions/31698510/can-i-force-the-order-of-dependencies-in-my-classpath-with-gradle - priority - sourceSets.main.compileClasspath = configurations.priority + sourceSets.main.compileClasspath -} - - dependencies { + shadow localGroovy() + shadow gradleApi() implementation 'org.apache.maven:maven-plugin-api:3.6.0' implementation 'org.codehaus.plexus:plexus-utils:3.1.1' implementation 'org.twdata.maven:mojo-executor:2.3.0' @@ -66,7 +62,6 @@ dependencies { implementation 'com.google.code.gson:gson:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.10.0' implementation 'org.rauschig:jarchivelib:1.2.0' - priority 'com.github.Osiris-Team:maven-plugin-tools:1.0.1' testImplementation 'org.junit.jupiter:junit-jupiter:5.8.2' testImplementation 'org.apache.maven.shared:maven-invoker:3.2.0' @@ -74,13 +69,22 @@ dependencies { compileOnly 'org.apache.maven.plugin-tools:maven-plugin-annotations:3.6.0' mavenEmbedder 'org.apache.maven:maven-embedder:3.6.0' - mavenEmbedder 'org.apache.maven:maven-compat:3.6.0' + mavenEmbedder 'org.apache.maven:maven-compat:3.6.0' mavenEmbedder 'org.slf4j:slf4j-simple:1.7.30' mavenEmbedder 'org.eclipse.aether:aether-connector-basic:1.1.0' mavenEmbedder 'org.eclipse.aether:aether-transport-wagon:1.1.0' mavenEmbedder 'org.apache.maven.wagon:wagon-http:3.4.1' mavenEmbedder 'org.apache.maven.wagon:wagon-provider-api:3.4.1' } +shadowJar{ + archiveClassifier.set('') // removes '-all' from the file name, to replace the regular plugin jar with the shaded one + minimize() +} +task relocateShadowJar(type: com.github.jengelman.gradle.plugins.shadow.tasks.ConfigureShadowRelocation) { + target = tasks.shadowJar +} + +tasks.shadowJar.dependsOn tasks.relocateShadowJar test { useJUnitPlatform() diff --git a/src/main/java/io/github/fvarrui/javapackager/Main.java b/src/main/java/io/github/fvarrui/javapackager/Main.java new file mode 100644 index 00000000..00e61513 --- /dev/null +++ b/src/main/java/io/github/fvarrui/javapackager/Main.java @@ -0,0 +1,112 @@ +package io.github.fvarrui.javapackager; + +import org.apache.commons.io.FileUtils; + +import java.io.File; +import java.io.IOException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.lang.reflect.Parameter; +import java.lang.reflect.TypeVariable; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +/** + * This class is temporary, and I am not sure + * if this makes into the final pull request. + */ +public class Main { + public static void main(String[] args) throws IOException { + File generatedDir = new File(System.getProperty("user.dir")+"/src/main/java/io/github/fvarrui/javapackager/generated"); + FileUtils.deleteDirectory(generatedDir); + generatedDir.mkdirs(); + File filePackageTask = new File(generatedDir.getParentFile()+"/PackageTask.java"); + List lines = new CopyOnWriteArrayList<>(Files.readAllLines(filePackageTask.toPath())); + int linesToRemove = 0; + for (String line : lines) { + if(linesToRemove > 0){ + lines.remove(line); + linesToRemove--; + } + else if(line.contains("org.gradle.api")) lines.remove(line); + else if(line.contains("if(isGradle){")){ + lines.remove(line); + linesToRemove = 4; // Remove next 4 lines + } + else if(line.contains(" Project ") || line.contains("@OutputFiles") + || line.contains("@TaskAction") || line.contains("@OutputDirectory") || line.contains("@InputDirectory") || line.contains("@Optional") + || line.contains("@InputFile") || line.contains("@Input") || line.contains("gradleProject")) + lines.remove(line); + } + + for (int i = 0; i < lines.size(); i++) { + String line = lines.get(i); + if(line.contains("extends DefaultTask")) { + line = line.replace("extends DefaultTask", ""); + lines.set(i, line); + } + if(line.contains("isGradle ?")){ + int iStart = line.indexOf("isGradle ?"); + int iEnd = line.indexOf(":"); + line = line.substring(0, iStart) + line.substring(iEnd + 1); + lines.set(i, line); + } + if(line.contains("package io.github.fvarrui.javapackager;")){ + line = line.replace("package io.github.fvarrui.javapackager;", "package io.github.fvarrui.javapackager.generated;"); + lines.set(i, line); + } + if(line.contains("PackageTask")){ + line = line.replace("PackageTask", "MavenPackageTask"); + lines.set(i, line); + } + } + + File generatedFilePackageTask = new File(generatedDir+"/MavenPackageTask.java"); + generatedFilePackageTask.createNewFile(); + Files.write(generatedFilePackageTask.toPath(), lines); + + File generatedFilePackageTaskFunctions = new File(generatedDir+"/PackageTaskFunctions.java"); + StringBuilder builder = new StringBuilder(); + builder.append("package io.github.fvarrui.javapackager.generated;\n"); + builder.append("public interface PackageTaskFunctions{\n"); + for (Method method : PackageTask.class.getMethods()) { + if(method.getModifiers() == Modifier.PRIVATE) continue; + if(!method.getDeclaringClass().equals(PackageTask.class)) continue; + String methodString = ""; + methodString +=method.getReturnType().getName()+" "; + methodString +=method.getName()+"("; + + + String params = ""; + for (Parameter parameter : method.getParameters()) { + params += (parameter.getParameterizedType().getTypeName() + +" "+parameter.getName()+","); + } + if(!params.isEmpty()){ + params = params.substring(0, params.length()-1); + methodString +=params; + } + methodString += ")"; + methodString = methodString.replace("io.github.fvarrui.javapackager.PackageTask", + "io.github.fvarrui.javapackager.generated.PackageTaskFunctions"); + + + String exceptions = ""; + for (Class exceptionType : method.getExceptionTypes()) { + exceptions += (exceptionType.getName()+","); + } + if(!exceptions.isEmpty()){ + exceptions = exceptions.substring(0, exceptions.length()-1); + methodString += " throws "+ exceptions; + } + + + builder.append(methodString+";\n"); + } + builder.append("}\n"); + generatedFilePackageTaskFunctions.createNewFile(); + Files.write(generatedFilePackageTaskFunctions.toPath(), builder.toString().getBytes(StandardCharsets.UTF_8)); + } +} diff --git a/src/main/java/io/github/fvarrui/javapackager/PackageTask.java b/src/main/java/io/github/fvarrui/javapackager/PackageTask.java index ba9a6288..b462889b 100644 --- a/src/main/java/io/github/fvarrui/javapackager/PackageTask.java +++ b/src/main/java/io/github/fvarrui/javapackager/PackageTask.java @@ -36,20 +36,20 @@ public class PackageTask extends DefaultTask implements Mojo, ContextEnabled { public PackageTask() { this.isGradle = Context.isGradle(); - this.project = (isGradle ? Context.getGradleContext().getProject() : null); + this.gradleProject = (isGradle ? Context.getGradleContext().getProject() : null); if(isGradle){ setGroup(PackagePlugin.GROUP_NAME); setDescription("Packages the application as a native Windows, Mac OS X or GNU/Linux executable and creates an installer"); getOutputs().upToDateWhen(o -> false); } - this.outputDirectory = (isGradle ? project.getBuildDir() : new File("${project.build.directory}")); + this.outputDirectory = (isGradle ? gradleProject.getBuildDir() : new File("${project.build.directory}")); this.platform = Platform.getCurrentPlatform(); this.bundleJre = true; this.copyDependencies = true; this.createTarball = false; this.createZipball = false; - this.description = project.getDescription(); + this.description = gradleProject.getDescription(); this.generateInstaller = true; this.linuxConfig = new LinuxConfig(); this.macConfig = new MacConfig(); @@ -57,10 +57,10 @@ public PackageTask() { this.modules = new ArrayList<>(); this.forceInstaller = false; this.mainClass = "${exec.mainClass}"; //TODO gradle? - this.appName = (isGradle ? project.getName() : "${project.name}"); - this.appDisplayName = (isGradle ? project.getName() : "${project.name}"); - this.version = (isGradle ? (String) project.getVersion() : "${project.version}"); - this.description = (isGradle ? project.getDescription(): "${project.description}"); + this.appName = (isGradle ? gradleProject.getName() : "${project.name}"); + this.appDisplayName = (isGradle ? gradleProject.getName() : "${project.name}"); + this.version = (isGradle ? (String) gradleProject.getVersion() : "${project.version}"); + this.description = (isGradle ? gradleProject.getDescription(): "${project.description}"); this.url = "${project.url}"; //TODO gradle? this.administratorRequired = false; this.organizationName = (isGradle ? null : "${project.organization.name}"); @@ -87,7 +87,7 @@ public PackageTask() { this.createZipball = false; this.extra = new HashMap<>(); this.useResourcesAsWorkingDir = true; - this.assetsDir = (isGradle ? new File(project.getProjectDir(), "assets") : new File("${project.basedir}/assets")); + this.assetsDir = (isGradle ? new File(gradleProject.getProjectDir(), "assets") : new File("${project.basedir}/assets")); this.classpath = null; this.jreMinVersion = null; manifest(new Manifest()); @@ -101,7 +101,7 @@ public PackageTask() { GRADLE SPECIFIC */ private boolean isGradle; - private Project project; + private Project gradleProject; private List outputFiles; @OutputFiles @@ -204,31 +204,31 @@ public Packager createPackager(){ // GRADLE SPECIFIC START public LinuxConfig linuxConfig(Closure closure) { linuxConfig = new LinuxConfig(); - project.configure(linuxConfig, closure); + gradleProject.configure(linuxConfig, closure); return linuxConfig; } public MacConfig macConfig(Closure closure) { macConfig = new MacConfig(); - project.configure(macConfig, closure); + gradleProject.configure(macConfig, closure); return macConfig; } public WindowsConfig winConfig(Closure closure) { winConfig = new WindowsConfig(); - project.configure(winConfig, closure); + gradleProject.configure(winConfig, closure); return winConfig; } public Manifest manifest(Closure closure) { manifest = new Manifest(); - project.configure(manifest, closure); + gradleProject.configure(manifest, closure); return manifest; } public Scripts scripts(Closure closure) { scripts = new Scripts(); - project.configure(scripts, closure); + gradleProject.configure(scripts, closure); return scripts; } // GRADLE SPECIFIC END diff --git a/src/test/java/io/github/fvarrui/javapackager/utils/updater/RealTest.java b/src/test/java/io/github/fvarrui/javapackager/utils/updater/RealTest.java index f1863125..1e9cf58e 100644 --- a/src/test/java/io/github/fvarrui/javapackager/utils/updater/RealTest.java +++ b/src/test/java/io/github/fvarrui/javapackager/utils/updater/RealTest.java @@ -12,13 +12,7 @@ public class RealTest { @Test - void testMavenAndGradle() throws Exception { - testMaven(); - testGradle(); - } - - @Test - void testMaven() throws Exception { + void helloWorldMaven() throws Exception { publishPluginLocally(); // PACKAGE MAVEN HELLO WORLD WITH CURRENT JAVA PACKAGER InvocationRequest request = new DefaultInvocationRequest(); @@ -35,7 +29,7 @@ void testMaven() throws Exception { } @Test - void testGradle() throws Exception { + void helloWorldGradle() throws Exception { publishPluginLocally(); // PACKAGE GRADLE HELLO WORLD WITH CURRENT JAVA PACKAGER if (getBuilder(getGradlew().getAbsolutePath(), diff --git a/test/hello-world-maven/pom.xml b/test/hello-world-maven/pom.xml index cb8f8f5f..8977f515 100644 --- a/test/hello-world-maven/pom.xml +++ b/test/hello-world-maven/pom.xml @@ -13,18 +13,6 @@ io.github.fvarrui.helloworld.Main - - - local - file:~/.m2/repository - - - central - Maven Central - https://repo1.maven.org/maven2/ - - - commons-io From 81cd72c5dd243f81c84517c597e8e662968800a7 Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Fri, 5 Aug 2022 17:47:57 +0200 Subject: [PATCH 39/74] comment --- build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.gradle b/build.gradle index 42abe1d2..e7a62fbe 100644 --- a/build.gradle +++ b/build.gradle @@ -77,6 +77,8 @@ dependencies { mavenEmbedder 'org.apache.maven.wagon:wagon-provider-api:3.4.1' } shadowJar{ + // Minimal shading is needed to include some gradle classes + // since otherwise when running this as a maven plugin we will get errors. archiveClassifier.set('') // removes '-all' from the file name, to replace the regular plugin jar with the shaded one minimize() } From 16868fb10929f0d2288fb22b3d024aa6abf2427a Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Sat, 6 Aug 2022 23:15:52 +0200 Subject: [PATCH 40/74] resolve MacPackager issues --- build.gradle | 4 ++- .../javapackager/packagers/MacPackager.java | 26 +++++++++---------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/build.gradle b/build.gradle index ccc50bee..400ebce4 100644 --- a/build.gradle +++ b/build.gradle @@ -79,7 +79,9 @@ shadowJar{ // Minimal shading is needed to include some gradle classes // since otherwise when running this as a maven plugin we will get errors. archiveClassifier.set('') // removes '-all' from the file name, to replace the regular plugin jar with the shaded one - minimize() + minimize { // Executes minimize for all dependencies except the below: + exclude(dependency('io.github.fvarrui:launch4j:.*')) + } } task relocateShadowJar(type: com.github.jengelman.gradle.plugins.shadow.tasks.ConfigureShadowRelocation) { target = tasks.shadowJar diff --git a/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java b/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java index 90b66d0f..a5e48aaa 100644 --- a/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java +++ b/src/main/java/io/github/fvarrui/javapackager/packagers/MacPackager.java @@ -112,7 +112,7 @@ public File doCreateApp() throws Exception { private void processStartupScript() throws Exception { - if (this.administratorRequired) { + if (task.getAdministratorRequired()) { // We need a helper script ("startup") in this case, // which invokes the launcher script/ executable with administrator rights. @@ -126,7 +126,7 @@ private void processStartupScript() throws Exception { } else { - File launcher = macConfig.getCustomLauncher(); + File launcher = task.getMacConfig().getCustomLauncher(); if(launcher != null && launcher.canRead() && launcher.isFile()){ FileUtils.copyFileToFolder(launcher, macOSFolder); this.executable = new File(macOSFolder, launcher.getName()); @@ -141,15 +141,15 @@ private void processStartupScript() throws Exception { private void processClasspath() { // TODO: Why are we doing this here? I do not see any usage of 'classpath' or 'classpaths' here. - classpath = (this.macConfig.isRelocateJar() ? "Java/" : "") + this.jarFile.getName() + (classpath != null ? ":" + classpath : ""); - classpaths = Arrays.asList(classpath.split("[:;]")); - if (!isUseResourcesAsWorkingDir()) { + task.classpath((task.getMacConfig().isRelocateJar() ? "Java/" : "") + this.jarFile.getName() + (task.getClasspath() != null ? ":" + task.getClasspath() : "")); + classpaths = Arrays.asList(task.getClasspath().split("[:;]")); + if (!task.isUseResourcesAsWorkingDir()) { classpaths = classpaths .stream() .map(cp -> new File(cp).isAbsolute() ? cp : "$ResourcesFolder/" + cp) .collect(Collectors.toList()); } - classpath = StringUtils.join(classpaths, ":"); + task.classpath(StringUtils.join(classpaths, ":")); } /** @@ -158,8 +158,8 @@ private void processClasspath() { */ private void processInfoPlistFile() throws Exception { File infoPlistFile = new File(contentsFolder, "Info.plist"); - if(macConfig.getCustomInfoPlist() != null && macConfig.getCustomInfoPlist().isFile() && macConfig.getCustomInfoPlist().canRead()){ - FileUtils.copyFileToFile(macConfig.getCustomInfoPlist(), infoPlistFile); + if(task.getMacConfig().getCustomInfoPlist() != null && task.getMacConfig().getCustomInfoPlist().isFile() && task.getMacConfig().getCustomInfoPlist().canRead()){ + FileUtils.copyFileToFile(task.getMacConfig().getCustomInfoPlist(), infoPlistFile); } else { VelocityUtils.render("mac/Info.plist.vtl", infoPlistFile, this); XMLUtils.prettify(infoPlistFile); @@ -178,12 +178,12 @@ private void codesign() throws Exception { } private void processProvisionProfileFile() throws Exception { - if (macConfig.getProvisionProfile() != null && macConfig.getProvisionProfile().isFile() && macConfig.getProvisionProfile().canRead()) { + if (task.getMacConfig().getProvisionProfile() != null && task.getMacConfig().getProvisionProfile().isFile() && task.getMacConfig().getProvisionProfile().canRead()) { // file name must be 'embedded.provisionprofile' File provisionProfile = new File(contentsFolder, "embedded.provisionprofile"); - FileUtils.copyFileToFile(macConfig.getProvisionProfile(), provisionProfile); + FileUtils.copyFileToFile(task.getMacConfig().getProvisionProfile(), provisionProfile); Logger.info("Provision profile file created from " + "\n" + - macConfig.getProvisionProfile() + " to \n" + + task.getMacConfig().getProvisionProfile() + " to \n" + provisionProfile.getAbsolutePath()); } } @@ -192,14 +192,14 @@ private File preparePrecompiledStartupStub() throws Exception { // sets startup file File appStubFile = new File(macOSFolder, "universalJavaApplicationStub"); String universalJavaApplicationStubResource = null; - switch (macConfig.getMacStartup()) { + switch (task.getMacConfig().getMacStartup()) { case UNIVERSAL: universalJavaApplicationStubResource = "universalJavaApplicationStub"; break; case X86_64: universalJavaApplicationStubResource = "universalJavaApplicationStub.x86_64"; break; case ARM64: universalJavaApplicationStubResource = "universalJavaApplicationStub.arm64"; break; case SCRIPT: universalJavaApplicationStubResource = "universalJavaApplicationStub.sh"; break; } // unixStyleNewLinux=true if startup is a script (this will replace '\r\n' with '\n') - FileUtils.copyResourceToFile("/mac/" + universalJavaApplicationStubResource, appStubFile, macConfig.getMacStartup() == MacStartup.SCRIPT); + FileUtils.copyResourceToFile("/mac/" + universalJavaApplicationStubResource, appStubFile, task.getMacConfig().getMacStartup() == MacStartup.SCRIPT); return appStubFile; } From 297165a86a8ffc6bda14e18e566e568cc1a1e670 Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Sat, 6 Aug 2022 23:30:18 +0200 Subject: [PATCH 41/74] fix dependencies missing --- build.gradle | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 400ebce4..9f1be4b1 100644 --- a/build.gradle +++ b/build.gradle @@ -63,7 +63,8 @@ dependencies { implementation 'com.squareup.okhttp3:okhttp:4.10.0' implementation 'org.rauschig:jarchivelib:1.2.0' - testImplementation 'junit:junit:4.13.1' + testImplementation 'org.junit.jupiter:junit-jupiter:5.9.0' + testImplementation 'org.apache.maven.shared:maven-invoker:3.2.0' compileOnly 'org.apache.maven.plugin-tools:maven-plugin-annotations:3.6.0' From 6dc084dfc532552ac711b624622fc77f0be424bb Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Sun, 7 Aug 2022 11:35:48 +0200 Subject: [PATCH 42/74] added available versions to readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ca3535ba..58f31181 100644 --- a/README.md +++ b/README.md @@ -162,7 +162,7 @@ By default it will generate next artifacts in `${outputDirectory} ` folder: | `fileAssociations` | :x: | [`FileAssociation[]`](https://github.com/fvarrui/JavaPackager/blob/master/src/main/java/io/github/fvarrui/javapackager/model/FileAssociation.java) | Associate file extensions or MIME types to the app. | | `forceInstaller` | :x: | `false` | If `true`, skips operating system check when generating installers. | | `generateInstaller` | :x: | `true` | Generates an installer for the app. | -| `jdkVersion` | :x: | `17` | JDK version to download and use. | +| `jdkVersion` | :x: | `17` | JDK version to download and use. Available versions for [adoptium](https://api.adoptium.net/v3/info/available_releases). | | `jdkVendor` | :x: | `adoptium` | JDK vendor to download the JDK from. Currently supported: `adoptium` | | `jdkPath` | :x: | `null` | If null downloads (if necessary and also updates it if needed) the right JDK for the selected platform and sets this value to `/jdk/win` or `/jdk/linux` or `/jdk/mac`. The downloaded JDK will be used to generate a customized JRE. | | `jreDirectoryName` | :x: | `"jre"` | Bundled JRE directory name. | From 18cd80875516a1a919abf9299cb74f3aea588cfe Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Sun, 7 Aug 2022 11:37:53 +0200 Subject: [PATCH 43/74] moved real test --- .../fvarrui/javapackager/{utils/updater => }/RealTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/test/java/io/github/fvarrui/javapackager/{utils/updater => }/RealTest.java (98%) diff --git a/src/test/java/io/github/fvarrui/javapackager/utils/updater/RealTest.java b/src/test/java/io/github/fvarrui/javapackager/RealTest.java similarity index 98% rename from src/test/java/io/github/fvarrui/javapackager/utils/updater/RealTest.java rename to src/test/java/io/github/fvarrui/javapackager/RealTest.java index 1e9cf58e..dd97235a 100644 --- a/src/test/java/io/github/fvarrui/javapackager/utils/updater/RealTest.java +++ b/src/test/java/io/github/fvarrui/javapackager/RealTest.java @@ -1,4 +1,4 @@ -package io.github.fvarrui.javapackager.utils.updater; +package io.github.fvarrui.javapackager; import io.github.fvarrui.javapackager.model.Platform; import org.apache.maven.shared.invoker.*; From a9d71af07f23539b060c4e59972db06798a09fc3 Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Fri, 12 Aug 2022 13:41:08 +0200 Subject: [PATCH 44/74] removed snapshot tag since then tests wont work, also removed shading --- README.md | 2 +- build.gradle | 19 +------------------ .../github/fvarrui/javapackager/RealTest.java | 2 ++ 3 files changed, 4 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 58f31181..6c9b29a0 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Add the following `plugin` tag to your `pom.xml`: io.github.fvarrui javapackager - 1.7.0-SNAPSHOT + 1.7.0 package diff --git a/build.gradle b/build.gradle index 9f1be4b1..792c00cc 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,6 @@ plugins { id 'io.codearte.nexus-staging' version '0.21.2' id 'eclipse' id 'de.undercouch.download' version '5.0.4' - id 'com.github.johnrengelman.shadow' version '6.1.0' } repositories { @@ -16,7 +15,6 @@ repositories { maven { url 'https://plugins.gradle.org/m2/' } - maven { url 'https://jitpack.io' } } gradlePlugin { @@ -45,8 +43,6 @@ configurations { } dependencies { - shadow localGroovy() - shadow gradleApi() implementation 'org.apache.maven:maven-plugin-api:3.6.0' implementation 'org.codehaus.plexus:plexus-utils:3.1.1' implementation 'org.twdata.maven:mojo-executor:2.3.0' @@ -76,26 +72,13 @@ dependencies { mavenEmbedder 'org.apache.maven.wagon:wagon-http:3.4.1' mavenEmbedder 'org.apache.maven.wagon:wagon-provider-api:3.4.1' } -shadowJar{ - // Minimal shading is needed to include some gradle classes - // since otherwise when running this as a maven plugin we will get errors. - archiveClassifier.set('') // removes '-all' from the file name, to replace the regular plugin jar with the shaded one - minimize { // Executes minimize for all dependencies except the below: - exclude(dependency('io.github.fvarrui:launch4j:.*')) - } -} -task relocateShadowJar(type: com.github.jengelman.gradle.plugins.shadow.tasks.ConfigureShadowRelocation) { - target = tasks.shadowJar -} - -tasks.shadowJar.dependsOn tasks.relocateShadowJar test { useJUnitPlatform() } group = 'io.github.fvarrui' -version = '1.7.0-SNAPSHOT' +version = '1.7.0' description = 'Hybrid Maven/Gradle plugin to package Java applications as native Windows, Mac OS X or GNU/Linux executables and create installers for them' sourceCompatibility = JavaVersion.VERSION_1_8 diff --git a/src/test/java/io/github/fvarrui/javapackager/RealTest.java b/src/test/java/io/github/fvarrui/javapackager/RealTest.java index dd97235a..a1d5ba40 100644 --- a/src/test/java/io/github/fvarrui/javapackager/RealTest.java +++ b/src/test/java/io/github/fvarrui/javapackager/RealTest.java @@ -41,10 +41,12 @@ void helloWorldGradle() throws Exception { @Test void publishPluginLocally() throws Exception { + System.out.println("Building and publishing plugin locally..."); // PUBLISH CURRENT JAVA PACKAGER TO LOCAL MAVEN REPO TO BE USED BY THE HELLO WORLD PROJECTS if (getBuilder(getGradlew().getAbsolutePath(), "build", "publishToMavenLocal", "-x", "validatePlugins", "-x", "test", "-x", "javadoc", "--stacktrace") .start().waitFor() != 0) throw new Exception("Failed! Exit code is not 0, see details further below:"); + System.out.println("Successfully built and published plugin locally."); } private File getGradlew(){ From 6e26297f53ec2a5967742c8850b3714024181e6d Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Sat, 13 Aug 2022 15:03:06 +0200 Subject: [PATCH 45/74] work on new generator --- build.gradle | 1 + .../io/github/fvarrui/javapackager/Main.java | 178 +++++++++++++++++- .../fvarrui/javapackager/PackageTask.java | 3 +- .../javapackager/generator/Closure.java | 4 + .../javapackager/generator/Directory.java | 4 + .../fvarrui/javapackager/generator/Input.java | 4 + .../javapackager/generator/Output.java | 4 + .../javapackager/generator/Plugin.java | 54 ++++++ .../generator/PluginClassFile.java | 26 +++ .../javapackager/generator/Required.java | 4 + .../javapackager/gradle/PackagePlugin.java | 5 - 11 files changed, 278 insertions(+), 9 deletions(-) create mode 100644 src/main/java/io/github/fvarrui/javapackager/generator/Closure.java create mode 100644 src/main/java/io/github/fvarrui/javapackager/generator/Directory.java create mode 100644 src/main/java/io/github/fvarrui/javapackager/generator/Input.java create mode 100644 src/main/java/io/github/fvarrui/javapackager/generator/Output.java create mode 100644 src/main/java/io/github/fvarrui/javapackager/generator/Plugin.java create mode 100644 src/main/java/io/github/fvarrui/javapackager/generator/PluginClassFile.java create mode 100644 src/main/java/io/github/fvarrui/javapackager/generator/Required.java diff --git a/build.gradle b/build.gradle index 792c00cc..15b40c72 100644 --- a/build.gradle +++ b/build.gradle @@ -58,6 +58,7 @@ dependencies { implementation 'com.google.code.gson:gson:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.10.0' implementation 'org.rauschig:jarchivelib:1.2.0' + implementation 'com.squareup:javapoet:1.13.0' testImplementation 'org.junit.jupiter:junit-jupiter:5.9.0' testImplementation 'org.apache.maven.shared:maven-invoker:3.2.0' diff --git a/src/main/java/io/github/fvarrui/javapackager/Main.java b/src/main/java/io/github/fvarrui/javapackager/Main.java index 00e61513..41d650ec 100644 --- a/src/main/java/io/github/fvarrui/javapackager/Main.java +++ b/src/main/java/io/github/fvarrui/javapackager/Main.java @@ -1,23 +1,46 @@ package io.github.fvarrui.javapackager; +import com.squareup.javapoet.*; +import edu.sc.seis.launch4j.tasks.Launch4jLibraryTask; +import io.github.fvarrui.javapackager.generator.*; +import io.github.fvarrui.javapackager.gradle.GradleContext; +import io.github.fvarrui.javapackager.packagers.Context; import org.apache.commons.io.FileUtils; import java.io.File; import java.io.IOException; +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; import java.lang.reflect.Method; -import java.lang.reflect.Modifier; import java.lang.reflect.Parameter; -import java.lang.reflect.TypeVariable; import java.nio.charset.StandardCharsets; import java.nio.file.Files; +import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.concurrent.CopyOnWriteArrayList; +import org.gradle.api.DefaultTask; +import org.gradle.api.tasks.InputDirectory; +import org.gradle.api.tasks.InputFile; + +import javax.lang.model.element.Modifier; + /** * This class is temporary, and I am not sure * if this makes into the final pull request. */ public class Main { + + public static void newMain(String[] args) throws IOException, ClassNotFoundException { + File dir = new File(System.getProperty("user.dir")+"/src/main/java/io/github/fvarrui/javapackager"); + List pluginClasses = getPluginClasses(dir); + for (PluginClassFile pluginClassFile : pluginClasses) { + generateMavenPluginClass(pluginClassFile); + generateGradlePluginClass(pluginClassFile); + } + } + public static void main(String[] args) throws IOException { File generatedDir = new File(System.getProperty("user.dir")+"/src/main/java/io/github/fvarrui/javapackager/generated"); FileUtils.deleteDirectory(generatedDir); @@ -72,7 +95,7 @@ else if(line.contains(" Project ") || line.contains("@OutputFiles") builder.append("package io.github.fvarrui.javapackager.generated;\n"); builder.append("public interface PackageTaskFunctions{\n"); for (Method method : PackageTask.class.getMethods()) { - if(method.getModifiers() == Modifier.PRIVATE) continue; + if(method.getModifiers() == java.lang.reflect.Modifier.PRIVATE) continue; if(!method.getDeclaringClass().equals(PackageTask.class)) continue; String methodString = ""; methodString +=method.getReturnType().getName()+" "; @@ -109,4 +132,153 @@ else if(line.contains(" Project ") || line.contains("@OutputFiles") generatedFilePackageTaskFunctions.createNewFile(); Files.write(generatedFilePackageTaskFunctions.toPath(), builder.toString().getBytes(StandardCharsets.UTF_8)); } + + /** + * Expects a class with the {@link Plugin} annotation + * to generate the gradle plugin class from in the desired output directory. + */ + private static void generateGradlePluginClass(PluginClassFile pluginClassFile) throws IOException, ClassNotFoundException { + Class pluginClass = pluginClassFile.loadClass(); + Field[] fields = pluginClass.getFields(); + Plugin pluginAnnotation = pluginClass.getAnnotation(Plugin.class); + + String simpleClassName = "Gradle"+pluginClass.getSimpleName(); + TypeSpec.Builder genClass = TypeSpec.classBuilder(simpleClassName) + .addJavadoc("This is a generated class thus modifying it, is not recommended." + + " Instead the actual class {@link "+pluginClass.getName()+"} should be edited.") + .addModifiers(Modifier.PUBLIC, Modifier.FINAL) + .superclass(DefaultTask.class) + .addSuperinterface(ParameterizedTypeName.get(org.gradle.api.Plugin.class, org.gradle.api.Project.class)); + + genClass.addMethod(MethodSpec.constructorBuilder() + .addStatement("setGroup($S)", pluginAnnotation.groupName()) + .addStatement("setDescription(§S)", pluginAnnotation.description()) + .addStatement("getOutputs().upToDateWhen(o -> false)") + .build()); + + genClass.addMethod(MethodSpec.methodBuilder("apply") + .addModifiers(Modifier.PUBLIC) + .returns(void.class) + .addParameter(org.gradle.api.Project.class, "project") + .addStatement("$T.setContext(new $T(project))", Context.class, GradleContext.class) + .addCode("project.getPluginManager().apply(\"java\");\n" + + "\t\tproject.getPluginManager().apply(\"edu.sc.seis.launch4j\");") + .addStatement(simpleClassName+" task = ("+simpleClassName+") project.getTasks().create($S, "+simpleClassName+".class).dependsOn(\"build\")", pluginAnnotation.taskName()) + .addCode("project.getExtensions().add("+pluginAnnotation.settingsExtName()+", task); // Use task instance as extension") + .addStatement("$T.getGradleContext().setLibraryTask(project.getTasks().create(\"launch4j_\" + UUID.randomUUID(), $T.class));", Context.class, Launch4jLibraryTask.class) + .build()); + + for (Field field : getFieldsWithAnnotation(fields, Input.class)) { + List> annotations = new ArrayList<>(); + if(field.getType().equals(File.class)) + if(field.isAnnotationPresent(Directory.class)) + annotations.add(org.gradle.api.tasks.InputDirectory.class); + else + annotations.add(org.gradle.api.tasks.InputFile.class); + else + annotations.add(org.gradle.api.tasks.Input.class); + + if(!field.isAnnotationPresent(Required.class)) + annotations.add(org.gradle.api.tasks.Optional.class); + + genClass.addField(fieldWithAnnotations(field.getType(), field.getName(), annotations).build()); + genClass.addMethod(getter(field.getType(), field.getName()).build()); + genClass.addMethod(modernSetter(field.getName()).build()); + if(field.isAnnotationPresent(Closure.class)) + genClass.addMethod(gradleClosureSetter(field.getType(), field.getName()).build()); + } + + JavaFile javaFile = JavaFile.builder(pluginClassFile.packageName, genClass.build()) + .build(); + javaFile.writeTo(new File(pluginClassFile.getParentFile()+"/"+simpleClassName+".java")); + } + + private static MethodSpec.Builder gradleClosureSetter(Class type, String fieldName) { + return MethodSpec.methodBuilder(fieldName) + .addModifiers(Modifier.PUBLIC, Modifier.STATIC) + .returns(type) + .addParameter(ParameterSpec.builder(ParameterizedTypeName.get(groovy.lang.Closure.class, type), "closure").build()) + .addCode("this."+fieldName+" = new "+type.getName()+"();\n" + + GradleContext.class.getName()+".getGradleContext().getProject().configure("+fieldName+", closure);\n" + + "return "+fieldName+";"); + } + + private static FieldSpec.Builder fieldWithAnnotations(Class type, String name, List> annotations) { + FieldSpec.Builder builder = FieldSpec.builder(type, name); + if(annotations!=null) + for (Class annotation : annotations) { + builder.addAnnotation(annotation); + } + return builder; + } + + // setter for field + private static MethodSpec.Builder modernSetter(String fieldName) { + return MethodSpec.methodBuilder(fieldName) + .addModifiers(Modifier.PUBLIC) + .returns(void.class) + .addCode("this."+fieldName+" = "+fieldName+";"); + } + + // getter for field + private static MethodSpec.Builder getter(Class returnType, String fieldName) { + String methodName = fieldName.replaceFirst(fieldName.substring(0, 1), fieldName.substring(0, 1).toUpperCase()); + return MethodSpec.methodBuilder("get"+methodName) + .addModifiers(Modifier.PUBLIC) + .returns(returnType) + .addCode("return "+fieldName+";"); + } + + private static List getFieldsWithAnnotation(Field[] fields, Class annotationClass) { + List list = new ArrayList<>(); + for (Field field : fields) { + if(field.isAnnotationPresent(annotationClass)){ + list.add(field); + } + } + return list; + } + + /** + * Expects a class with the {@link io.github.fvarrui.javapackager.generator.Plugin} annotation + * to generate the maven plugin class from in the desired output directory. + */ + private static void generateMavenPluginClass(PluginClassFile pluginClass) { + + } + + /** + * Recursively searches the provided directory for + * files containing the {@link io.github.fvarrui.javapackager.generator.Plugin} annotation. + */ + private static List getPluginClasses(File dir) throws IOException { + if(dir.isFile()) throw new IllegalArgumentException("Parameter 'dir' must be a directory and not a file!"); + List files = new ArrayList<>(); + for (File f : dir.listFiles()) { + if(f.isDirectory()) files.addAll(getPluginClasses(f)); + else{ + List lines = Files.readAllLines(f.toPath()); + PluginClassFile pluginClassFile = null; + for (String line : lines) { + if(line.contains("io.github.fvarrui.javapackager.generator.Plugin")) { + pluginClassFile = new PluginClassFile(f.getAbsolutePath(), null, dir); + break; + } + } + if(pluginClassFile != null) { + String packageName = null; + for (String line : lines) { + if(line.contains("package")){ + packageName = line.replace("package ", "").replace(";", "").trim(); + break; + } + } + Objects.requireNonNull(packageName); + pluginClassFile.packageName = packageName; + files.add(pluginClassFile); + } + } + } + return files; + } } diff --git a/src/main/java/io/github/fvarrui/javapackager/PackageTask.java b/src/main/java/io/github/fvarrui/javapackager/PackageTask.java index b462889b..62526419 100644 --- a/src/main/java/io/github/fvarrui/javapackager/PackageTask.java +++ b/src/main/java/io/github/fvarrui/javapackager/PackageTask.java @@ -8,6 +8,7 @@ import java.util.stream.Collectors; import groovy.lang.Closure; +import io.github.fvarrui.javapackager.gradle.GradleContext; import io.github.fvarrui.javapackager.gradle.PackagePlugin; import io.github.fvarrui.javapackager.maven.MavenContext; import io.github.fvarrui.javapackager.model.*; @@ -204,7 +205,7 @@ public Packager createPackager(){ // GRADLE SPECIFIC START public LinuxConfig linuxConfig(Closure closure) { linuxConfig = new LinuxConfig(); - gradleProject.configure(linuxConfig, closure); + GradleContext.getGradleContext().getProject().configure(linuxConfig, closure); return linuxConfig; } diff --git a/src/main/java/io/github/fvarrui/javapackager/generator/Closure.java b/src/main/java/io/github/fvarrui/javapackager/generator/Closure.java new file mode 100644 index 00000000..6332e863 --- /dev/null +++ b/src/main/java/io/github/fvarrui/javapackager/generator/Closure.java @@ -0,0 +1,4 @@ +package io.github.fvarrui.javapackager.generator; + +public @interface Closure { +} diff --git a/src/main/java/io/github/fvarrui/javapackager/generator/Directory.java b/src/main/java/io/github/fvarrui/javapackager/generator/Directory.java new file mode 100644 index 00000000..bae1c11d --- /dev/null +++ b/src/main/java/io/github/fvarrui/javapackager/generator/Directory.java @@ -0,0 +1,4 @@ +package io.github.fvarrui.javapackager.generator; + +public @interface Directory { +} diff --git a/src/main/java/io/github/fvarrui/javapackager/generator/Input.java b/src/main/java/io/github/fvarrui/javapackager/generator/Input.java new file mode 100644 index 00000000..428d9542 --- /dev/null +++ b/src/main/java/io/github/fvarrui/javapackager/generator/Input.java @@ -0,0 +1,4 @@ +package io.github.fvarrui.javapackager.generator; + +public @interface Input { +} diff --git a/src/main/java/io/github/fvarrui/javapackager/generator/Output.java b/src/main/java/io/github/fvarrui/javapackager/generator/Output.java new file mode 100644 index 00000000..02d0b227 --- /dev/null +++ b/src/main/java/io/github/fvarrui/javapackager/generator/Output.java @@ -0,0 +1,4 @@ +package io.github.fvarrui.javapackager.generator; + +public @interface Output { +} diff --git a/src/main/java/io/github/fvarrui/javapackager/generator/Plugin.java b/src/main/java/io/github/fvarrui/javapackager/generator/Plugin.java new file mode 100644 index 00000000..a452ba37 --- /dev/null +++ b/src/main/java/io/github/fvarrui/javapackager/generator/Plugin.java @@ -0,0 +1,54 @@ +package io.github.fvarrui.javapackager.generator; + +import org.apache.maven.plugins.annotations.InstantiationStrategy; +import org.apache.maven.plugins.annotations.LifecyclePhase; +import org.apache.maven.plugins.annotations.ResolutionScope; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Documented +@Retention(RetentionPolicy.CLASS) +@Target({ElementType.TYPE}) +@Inherited +public @interface Plugin { + + // MAVEN: + String name(); + + LifecyclePhase defaultPhase() default LifecyclePhase.NONE; + + ResolutionScope requiresDependencyResolution() default ResolutionScope.NONE; + + ResolutionScope requiresDependencyCollection() default ResolutionScope.NONE; + + InstantiationStrategy instantiationStrategy() default InstantiationStrategy.PER_LOOKUP; + + String executionStrategy() default "once-per-session"; + + boolean requiresProject() default true; + + boolean requiresReports() default false; + + boolean aggregator() default false; + + boolean requiresDirectInvocation() default false; + + boolean requiresOnline() default false; + + boolean inheritByDefault() default true; + + String configurator() default ""; + + boolean threadSafe() default false; + + // GRADLE: + String groupName() default "JavaPackager"; + String settingsExtName() default "javapackager"; + String taskName() default "package"; + String description() default "Packages the application as a native Windows, Mac OS X or GNU/Linux executable and creates an installer."; +} diff --git a/src/main/java/io/github/fvarrui/javapackager/generator/PluginClassFile.java b/src/main/java/io/github/fvarrui/javapackager/generator/PluginClassFile.java new file mode 100644 index 00000000..ebf27a1b --- /dev/null +++ b/src/main/java/io/github/fvarrui/javapackager/generator/PluginClassFile.java @@ -0,0 +1,26 @@ +package io.github.fvarrui.javapackager.generator; + +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; + +public class PluginClassFile extends File { + public String packageName; + public File baseDir; + + public PluginClassFile(@NotNull String pathname, String packageName, File baseDir) { + super(pathname); + this.packageName = packageName; + this.baseDir = baseDir; + } + + public Class loadClass() throws MalformedURLException, ClassNotFoundException { + URL url = baseDir.toURI().toURL(); + URL[] urls = new URL[]{url}; + ClassLoader cl = new URLClassLoader(urls); + return cl.loadClass(packageName); + } +} diff --git a/src/main/java/io/github/fvarrui/javapackager/generator/Required.java b/src/main/java/io/github/fvarrui/javapackager/generator/Required.java new file mode 100644 index 00000000..2b088d54 --- /dev/null +++ b/src/main/java/io/github/fvarrui/javapackager/generator/Required.java @@ -0,0 +1,4 @@ +package io.github.fvarrui.javapackager.generator; + +public @interface Required { +} diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePlugin.java b/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePlugin.java index 3c718964..75925aa0 100644 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePlugin.java +++ b/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePlugin.java @@ -32,11 +32,6 @@ public void apply(Project project) { project.getExtensions().add(SETTINGS_EXT_NAME, task); // Use task instance as extension Context.getGradleContext().setLibraryTask(project.getTasks().create("launch4j_" + UUID.randomUUID(), Launch4jLibraryTask.class)); - - System.out.println("TASKS: "+project.getTasks().size()); - for (Task t : project.getTasks()) { - System.out.println("name: "+t.getName()+" desc: "+t.getDescription()); - } } } From acda43486e759e78a41448eaf8fa860e71987f3c Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Sat, 13 Aug 2022 19:17:50 +0200 Subject: [PATCH 46/74] work on new generator --- .../io/github/fvarrui/javapackager/Main.java | 131 +++++++++++++++--- .../github/fvarrui/javapackager/MainTest.java | 62 +++++++++ 2 files changed, 175 insertions(+), 18 deletions(-) create mode 100644 src/test/java/io/github/fvarrui/javapackager/MainTest.java diff --git a/src/main/java/io/github/fvarrui/javapackager/Main.java b/src/main/java/io/github/fvarrui/javapackager/Main.java index 41d650ec..2e450091 100644 --- a/src/main/java/io/github/fvarrui/javapackager/Main.java +++ b/src/main/java/io/github/fvarrui/javapackager/Main.java @@ -11,8 +11,10 @@ import java.io.IOException; import java.lang.annotation.Annotation; import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Parameter; +import java.net.MalformedURLException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.util.ArrayList; @@ -20,9 +22,12 @@ import java.util.Objects; import java.util.concurrent.CopyOnWriteArrayList; +import org.apache.maven.plugin.AbstractMojo; +import org.apache.maven.plugins.annotations.Mojo; import org.gradle.api.DefaultTask; import org.gradle.api.tasks.InputDirectory; import org.gradle.api.tasks.InputFile; +import org.gradle.api.tasks.TaskAction; import javax.lang.model.element.Modifier; @@ -32,7 +37,7 @@ */ public class Main { - public static void newMain(String[] args) throws IOException, ClassNotFoundException { + public static void newMain(String[] args) throws IOException, ClassNotFoundException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException { File dir = new File(System.getProperty("user.dir")+"/src/main/java/io/github/fvarrui/javapackager"); List pluginClasses = getPluginClasses(dir); for (PluginClassFile pluginClassFile : pluginClasses) { @@ -133,12 +138,68 @@ else if(line.contains(" Project ") || line.contains("@OutputFiles") Files.write(generatedFilePackageTaskFunctions.toPath(), builder.toString().getBytes(StandardCharsets.UTF_8)); } + /** + * Expects a class with the {@link io.github.fvarrui.javapackager.generator.Plugin} annotation + * to generate the maven plugin class from in the desired output directory. + */ + private static void generateMavenPluginClass(PluginClassFile pluginClassFile) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { + Class pluginClass = pluginClassFile.loadClass(); + Object pluginClassInstance = pluginClass.getDeclaredConstructor().newInstance(); + Field[] fields = pluginClass.getFields(); + Plugin pluginAnnotation = pluginClass.getAnnotation(Plugin.class); + + String simpleClassName = "Maven"+pluginClass.getSimpleName(); + TypeSpec.Builder genClass = TypeSpec.classBuilder(simpleClassName) + .addJavadoc("This is a generated class thus modifying it, is not recommended." + + " Instead the actual class {@link "+pluginClass.getName()+"} should be edited.") + .addModifiers(Modifier.PUBLIC) + .superclass(AbstractMojo.class) + .addAnnotation(AnnotationSpec.builder(Mojo.class) + .addMember("name", "$L", pluginAnnotation.name()) + .addMember("defaultPhase", "$L", pluginAnnotation.defaultPhase()) + .addMember("requiresDependencyResolution", "$L", pluginAnnotation.requiresDependencyResolution()) + .build()); + + for (Field field : getFieldsWithAnnotation(fields, Input.class)) { + AnnotationSpec.Builder annotation = AnnotationSpec.builder(org.apache.maven.plugins.annotations.Parameter.class) + .addMember("property", "$L", field.getName()); + + if(field.isAnnotationPresent(Required.class)) + annotation.addMember("required", "true"); + + genClass.addField(FieldSpec.builder(field.getType(), field.getName()).addModifiers(Modifier.PRIVATE) + .addAnnotation(annotation.build()) + .initializer("$L", field.get(pluginClassInstance)).build()); + genClass.addMethod(getter(field.getType(), field.getName()).build()); + genClass.addMethod(modernSetter(field.getName()).build()); + } + + for (Field field : getFieldsWithAnnotation(fields, Output.class)) { + AnnotationSpec.Builder annotation = AnnotationSpec.builder(org.apache.maven.plugins.annotations.Parameter.class) + .addMember("property", "$L", field.getName()); + + if(field.isAnnotationPresent(Required.class)) + annotation.addMember("required", "true"); + + genClass.addField(FieldSpec.builder(field.getType(), field.getName()).addModifiers(Modifier.PRIVATE) + .addAnnotation(annotation.build()) + .initializer("$L", field.get(pluginClassInstance)).build()); + genClass.addMethod(getter(field.getType(), field.getName()).build()); + genClass.addMethod(modernSetter(field.getName()).build()); + } + + JavaFile javaFile = JavaFile.builder(pluginClassFile.packageName, genClass.build()) + .build(); + javaFile.writeTo(new File(pluginClassFile.getParentFile()+"/"+simpleClassName+".java")); + } + /** * Expects a class with the {@link Plugin} annotation * to generate the gradle plugin class from in the desired output directory. */ - private static void generateGradlePluginClass(PluginClassFile pluginClassFile) throws IOException, ClassNotFoundException { + private static void generateGradlePluginClass(PluginClassFile pluginClassFile) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { Class pluginClass = pluginClassFile.loadClass(); + Object pluginClassInstance = pluginClass.getDeclaredConstructor().newInstance(); Field[] fields = pluginClass.getFields(); Plugin pluginAnnotation = pluginClass.getAnnotation(Plugin.class); @@ -146,10 +207,12 @@ private static void generateGradlePluginClass(PluginClassFile pluginClassFile) t TypeSpec.Builder genClass = TypeSpec.classBuilder(simpleClassName) .addJavadoc("This is a generated class thus modifying it, is not recommended." + " Instead the actual class {@link "+pluginClass.getName()+"} should be edited.") - .addModifiers(Modifier.PUBLIC, Modifier.FINAL) + .addModifiers(Modifier.PUBLIC) .superclass(DefaultTask.class) .addSuperinterface(ParameterizedTypeName.get(org.gradle.api.Plugin.class, org.gradle.api.Project.class)); + //TypeSpec.Builder genClassInterface = TypeSpec.interfaceBuilder(pluginClass.getSimpleName() + "Methods"); + genClass.addMethod(MethodSpec.constructorBuilder() .addStatement("setGroup($S)", pluginAnnotation.groupName()) .addStatement("setDescription(§S)", pluginAnnotation.description()) @@ -162,10 +225,28 @@ private static void generateGradlePluginClass(PluginClassFile pluginClassFile) t .addParameter(org.gradle.api.Project.class, "project") .addStatement("$T.setContext(new $T(project))", Context.class, GradleContext.class) .addCode("project.getPluginManager().apply(\"java\");\n" + - "\t\tproject.getPluginManager().apply(\"edu.sc.seis.launch4j\");") + "project.getPluginManager().apply(\"edu.sc.seis.launch4j\");\n") .addStatement(simpleClassName+" task = ("+simpleClassName+") project.getTasks().create($S, "+simpleClassName+".class).dependsOn(\"build\")", pluginAnnotation.taskName()) - .addCode("project.getExtensions().add("+pluginAnnotation.settingsExtName()+", task); // Use task instance as extension") - .addStatement("$T.getGradleContext().setLibraryTask(project.getTasks().create(\"launch4j_\" + UUID.randomUUID(), $T.class));", Context.class, Launch4jLibraryTask.class) + .addCode("project.getExtensions().add("+pluginAnnotation.settingsExtName()+", task); // Use task instance as extension\n") + .addStatement("$T.getGradleContext().setLibraryTask(project.getTasks().create(\"launch4j_\" + UUID.randomUUID(), $T.class))", Context.class, Launch4jLibraryTask.class) + .build()); + + genClass.addMethod(MethodSpec.methodBuilder("execute") + .addModifiers(Modifier.PUBLIC) + .returns(void.class) + .addException(Exception.class) + .addAnnotation(TaskAction.class) + .addCode("Packager packager = this.createPackager();\n" + + "// generates app, installers and bundles\n" + + "File app = packager.createApp();\n" + + "List installers = packager.generateInstallers();\n" + + "List bundles = packager.createBundles();\n" + + "\n" + + "// sets generated files as output\n" + + "outputFiles = new ArrayList<>();\n" + + "outputFiles.add(app);\n" + + "outputFiles.addAll(installers);\n" + + "outputFiles.addAll(bundles);\n") .build()); for (Field field : getFieldsWithAnnotation(fields, Input.class)) { @@ -181,7 +262,29 @@ private static void generateGradlePluginClass(PluginClassFile pluginClassFile) t if(!field.isAnnotationPresent(Required.class)) annotations.add(org.gradle.api.tasks.Optional.class); - genClass.addField(fieldWithAnnotations(field.getType(), field.getName(), annotations).build()); + genClass.addField(fieldWithAnnotations(field.getType(), field.getName(), annotations).addModifiers(Modifier.PRIVATE) + .initializer("$L", field.get(pluginClassInstance)).build()); + genClass.addMethod(getter(field.getType(), field.getName()).build()); + genClass.addMethod(modernSetter(field.getName()).build()); + if(field.isAnnotationPresent(Closure.class)) + genClass.addMethod(gradleClosureSetter(field.getType(), field.getName()).build()); + } + + for (Field field : getFieldsWithAnnotation(fields, Output.class)) { + List> annotations = new ArrayList<>(); + if(field.getType().equals(File.class)) + if(field.isAnnotationPresent(Directory.class)) + annotations.add(org.gradle.api.tasks.OutputDirectory.class); + else + annotations.add(org.gradle.api.tasks.OutputFile.class); + //else + //annotations.add(org.gradle.api.tasks.Output.class); + + if(!field.isAnnotationPresent(Required.class)) + annotations.add(org.gradle.api.tasks.Optional.class); + + genClass.addField(fieldWithAnnotations(field.getType(), field.getName(), annotations).addModifiers(Modifier.PRIVATE) + .initializer("$L", field.get(pluginClassInstance)).build()); genClass.addMethod(getter(field.getType(), field.getName()).build()); genClass.addMethod(modernSetter(field.getName()).build()); if(field.isAnnotationPresent(Closure.class)) @@ -200,7 +303,7 @@ private static MethodSpec.Builder gradleClosureSetter(Class type, String fiel .addParameter(ParameterSpec.builder(ParameterizedTypeName.get(groovy.lang.Closure.class, type), "closure").build()) .addCode("this."+fieldName+" = new "+type.getName()+"();\n" + GradleContext.class.getName()+".getGradleContext().getProject().configure("+fieldName+", closure);\n" + - "return "+fieldName+";"); + "return "+fieldName+";\n"); } private static FieldSpec.Builder fieldWithAnnotations(Class type, String name, List> annotations) { @@ -217,7 +320,7 @@ private static MethodSpec.Builder modernSetter(String fieldName) { return MethodSpec.methodBuilder(fieldName) .addModifiers(Modifier.PUBLIC) .returns(void.class) - .addCode("this."+fieldName+" = "+fieldName+";"); + .addCode("this."+fieldName+" = "+fieldName+";\n"); } // getter for field @@ -226,7 +329,7 @@ private static MethodSpec.Builder getter(Class returnType, String fieldName) return MethodSpec.methodBuilder("get"+methodName) .addModifiers(Modifier.PUBLIC) .returns(returnType) - .addCode("return "+fieldName+";"); + .addCode("return "+fieldName+";\n"); } private static List getFieldsWithAnnotation(Field[] fields, Class annotationClass) { @@ -239,14 +342,6 @@ private static List getFieldsWithAnnotation(Field[] fields, Class false)") + .build()); + + genClass.addMethod(MethodSpec.methodBuilder("apply") + .addModifiers(Modifier.PUBLIC) + .returns(void.class) + .addParameter(org.gradle.api.Project.class, "project") + .addStatement("$T.setContext(new $T(project))", Context.class, GradleContext.class) + .addCode("project.getPluginManager().apply(\"java\");\n" + + "\t\tproject.getPluginManager().apply(\"edu.sc.seis.launch4j\");\n") + .addStatement(simpleClassName+" task = ("+simpleClassName+") project.getTasks().create($S, "+simpleClassName+".class).dependsOn(\"build\")", "pluginAnnotation.taskName()") + .addCode("project.getExtensions().add(pluginAnnotation.settingsExtName(), task); // Use task instance as extension\n") + .addStatement("$T.getGradleContext().setLibraryTask(project.getTasks().create(\"launch4j_\" + UUID.randomUUID(), $T.class))", Context.class, Launch4jLibraryTask.class) + .build()); + + JavaFile javaFile = JavaFile.builder("com.my.package", genClass.build()) + .build(); + javaFile.writeTo(System.out); + } +} \ No newline at end of file From 8b76fb8919369853ae250e3b129d83fc80e622c3 Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Fri, 19 Aug 2022 14:24:30 +0200 Subject: [PATCH 47/74] avoid mojoexecution exception --- .../javapackager/GradlePackageTask.java | 1018 +++++++++++++++++ .../io/github/fvarrui/javapackager/Main.java | 379 ------ .../javapackager/MavenPackageTask.java | 72 ++ .../fvarrui/javapackager/PackageTask.java | 202 +--- .../fvarrui/javapackager/PackagerFactory.java | 25 + .../javapackager/generator/Closure.java | 4 - .../javapackager/generator/Directory.java | 4 - .../fvarrui/javapackager/generator/Input.java | 4 - .../javapackager/generator/Output.java | 4 - .../javapackager/generator/Plugin.java | 54 - .../generator/PluginClassFile.java | 26 - .../javapackager/generator/Required.java | 4 - .../javapackager/gradle/PackagePlugin.java | 3 +- .../github/fvarrui/javapackager/MainTest.java | 62 - 14 files changed, 1137 insertions(+), 724 deletions(-) create mode 100644 src/main/java/io/github/fvarrui/javapackager/GradlePackageTask.java delete mode 100644 src/main/java/io/github/fvarrui/javapackager/Main.java create mode 100644 src/main/java/io/github/fvarrui/javapackager/MavenPackageTask.java create mode 100644 src/main/java/io/github/fvarrui/javapackager/PackagerFactory.java delete mode 100644 src/main/java/io/github/fvarrui/javapackager/generator/Closure.java delete mode 100644 src/main/java/io/github/fvarrui/javapackager/generator/Directory.java delete mode 100644 src/main/java/io/github/fvarrui/javapackager/generator/Input.java delete mode 100644 src/main/java/io/github/fvarrui/javapackager/generator/Output.java delete mode 100644 src/main/java/io/github/fvarrui/javapackager/generator/Plugin.java delete mode 100644 src/main/java/io/github/fvarrui/javapackager/generator/PluginClassFile.java delete mode 100644 src/main/java/io/github/fvarrui/javapackager/generator/Required.java delete mode 100644 src/test/java/io/github/fvarrui/javapackager/MainTest.java diff --git a/src/main/java/io/github/fvarrui/javapackager/GradlePackageTask.java b/src/main/java/io/github/fvarrui/javapackager/GradlePackageTask.java new file mode 100644 index 00000000..e7f1ac75 --- /dev/null +++ b/src/main/java/io/github/fvarrui/javapackager/GradlePackageTask.java @@ -0,0 +1,1018 @@ +package io.github.fvarrui.javapackager; + +import com.google.common.collect.Collections2; +import com.google.common.collect.ImmutableList; +import groovy.lang.Closure; +import groovy.lang.MissingPropertyException; +import groovy.util.ObservableList; +import io.github.fvarrui.javapackager.gradle.GradleContext; +import io.github.fvarrui.javapackager.gradle.PackagePlugin; +import io.github.fvarrui.javapackager.model.*; +import io.github.fvarrui.javapackager.packagers.Context; +import io.github.fvarrui.javapackager.packagers.Packager; +import org.codehaus.groovy.runtime.InvokerInvocationException; +import org.gradle.api.*; +import org.gradle.api.internal.DynamicObjectAware; +import org.gradle.api.internal.TaskInputsInternal; +import org.gradle.api.internal.TaskInternal; +import org.gradle.api.internal.TaskOutputsInternal; +import org.gradle.api.internal.file.FileCollectionFactory; +import org.gradle.api.internal.file.TemporaryFileProvider; +import org.gradle.api.internal.project.ProjectInternal; +import org.gradle.api.internal.project.taskfactory.TaskIdentity; +import org.gradle.api.internal.tasks.*; +import org.gradle.api.internal.tasks.execution.TaskExecutionAccessListener; +import org.gradle.api.internal.tasks.properties.PropertyWalker; +import org.gradle.api.logging.Logger; +import org.gradle.api.logging.Logging; +import org.gradle.api.plugins.Convention; +import org.gradle.api.plugins.ExtensionContainer; +import org.gradle.api.provider.Property; +import org.gradle.api.provider.Provider; +import org.gradle.api.services.BuildService; +import org.gradle.api.services.internal.BuildServiceRegistryInternal; +import org.gradle.api.specs.AndSpec; +import org.gradle.api.specs.Spec; +import org.gradle.api.tasks.*; +import org.gradle.configuration.internal.UserCodeApplicationContext; +import org.gradle.internal.Cast; +import org.gradle.internal.Factory; +import org.gradle.internal.event.ListenerManager; +import org.gradle.internal.execution.history.changes.InputChangesInternal; +import org.gradle.internal.extensibility.ExtensibleDynamicObject; +import org.gradle.internal.hash.ClassLoaderHierarchyHasher; +import org.gradle.internal.impldep.com.google.common.collect.ImmutableSet; +import org.gradle.internal.instantiation.InstanceGenerator; +import org.gradle.internal.logging.compatbridge.LoggingManagerInternalCompatibilityBridge; +import org.gradle.internal.logging.slf4j.ContextAwareTaskLogger; +import org.gradle.internal.logging.slf4j.DefaultContextAwareTaskLogger; +import org.gradle.internal.metaobject.DynamicObject; +import org.gradle.internal.resources.ResourceLock; +import org.gradle.internal.resources.SharedResource; +import org.gradle.internal.scripts.ScriptOrigin; +import org.gradle.internal.serialization.Cached; +import org.gradle.internal.service.ServiceRegistry; +import org.gradle.internal.snapshot.impl.ImplementationSnapshot; +import org.gradle.util.ConfigureUtil; +import org.gradle.util.GFileUtils; +import org.gradle.util.Path; + +import javax.annotation.Nullable; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.io.File; +import java.time.Duration; +import java.util.*; +import java.util.concurrent.Callable; + +import static org.gradle.api.internal.lambdas.SerializableLambdas.factory; +import static org.gradle.util.GUtil.uncheckedCall; + +public class GradlePackageTask extends PackageTask implements TaskInternal, DynamicObjectAware, Task, PackagerFactory { + private final Project gradleProject = Context.getGradleContext().getProject(); + private List outputFiles; + + public GradlePackageTask() { + + // AbstractTask.class start + TaskInfo taskInfo = NEXT_INSTANCE.get(); + if (taskInfo == null) { + throw new TaskInstantiationException(String.format("Task of type '%s' has been instantiated directly which is not supported. Tasks can only be created using the Gradle API or DSL.", getClass().getName())); + } + this.identity = taskInfo.identity; + this.project = taskInfo.project; + assert project != null; + assert identity.name != null; + this.state = new TaskStateInternal(); + TaskContainerInternal tasks = project.getTasks(); + this.mustRunAfter = new DefaultTaskDependency(tasks); + this.finalizedBy = new DefaultTaskDependency(tasks); + this.shouldRunAfter = new DefaultTaskDependency(tasks); + this.services = project.getServices(); + PropertyWalker propertyWalker = services.get(PropertyWalker.class); + FileCollectionFactory fileCollectionFactory = services.get(FileCollectionFactory.class); + taskMutator = new TaskMutator(this); + taskInputs = new DefaultTaskInputs(this, taskMutator, propertyWalker, fileCollectionFactory); + taskOutputs = new DefaultTaskOutputs(this, taskMutator, propertyWalker, fileCollectionFactory); + taskDestroyables = new DefaultTaskDestroyables(taskMutator, fileCollectionFactory); + taskLocalState = new DefaultTaskLocalState(taskMutator, fileCollectionFactory); + this.dependencies = new DefaultTaskDependency(tasks, ImmutableSet.of(taskInputs)); + this.timeout = project.getObjects().property(Duration.class); + // AbstractTask.class end + + setGroup(PackagePlugin.GROUP_NAME); + setDescription("Packages the application as a native Windows, Mac OS X or GNU/Linux executable and creates an installer"); + getOutputs().upToDateWhen(o -> false); + + // Defaults specific to gradle + this.outputDirectory = gradleProject.getBuildDir(); + this.description = gradleProject.getDescription(); + this.appName = gradleProject.getName(); + this.appDisplayName = gradleProject.getName(); + this.version = gradleProject.getVersion().toString(); + this.description = gradleProject.getDescription(); + this.organizationName = null; + this.organizationUrl = null; + this.assetsDir = new File(gradleProject.getProjectDir(), "assets"); + } + + @OutputFiles + public List getOutputFiles() { + return outputFiles != null ? outputFiles : new ArrayList<>(); + } + + /** + * Packaging task action + * @throws Exception Throwed if something went wrong + */ + @TaskAction + public void doPackage() throws Exception { + + Packager packager = this.createPackager(this); + // generates app, installers and bundles + File app = packager.createApp(); + List installers = packager.generateInstallers(); + List bundles = packager.createBundles(); + + // sets generated files as output + outputFiles = new ArrayList<>(); + outputFiles.add(app); + outputFiles.addAll(installers); + outputFiles.addAll(bundles); + + } + + public LinuxConfig linuxConfig(Closure closure) { + linuxConfig = new LinuxConfig(); + GradleContext.getGradleContext().getProject().configure(linuxConfig, closure); + return linuxConfig; + } + + public MacConfig macConfig(Closure closure) { + macConfig = new MacConfig(); + gradleProject.configure(macConfig, closure); + return macConfig; + } + + public WindowsConfig winConfig(Closure closure) { + winConfig = new WindowsConfig(); + gradleProject.configure(winConfig, closure); + return winConfig; + } + + public Manifest manifest(Closure closure) { + manifest = new Manifest(); + gradleProject.configure(manifest, closure); + return manifest; + } + + public Scripts scripts(Closure closure) { + scripts = new Scripts(); + gradleProject.configure(scripts, closure); + return scripts; + } + + /* + FROM ABSTRACTTASK.CLASS + */ + + private static final Logger BUILD_LOGGER = Logging.getLogger(Task.class); + private static final ThreadLocal NEXT_INSTANCE = new ThreadLocal(); + + private final TaskIdentity identity; + + private final ProjectInternal project; + + private List actions; + + private boolean enabled = true; + + private final DefaultTaskDependency dependencies; + + private final DefaultTaskDependency mustRunAfter; + + private final DefaultTaskDependency finalizedBy; + + private final DefaultTaskDependency shouldRunAfter; + + private ExtensibleDynamicObject extensibleDynamicObject; + + private String description; + + private String group; + + private final Property timeout; + + private AndSpec onlyIfSpec = createNewOnlyIfSpec(); + + private final ServiceRegistry services; + + private final TaskStateInternal state; + + private final ContextAwareTaskLogger logger = new DefaultContextAwareTaskLogger(BUILD_LOGGER); + + private final TaskMutator taskMutator; + private ObservableList observableActionList; + private boolean impliesSubProjects; + private boolean hasCustomActions; + + private final TaskInputsInternal taskInputs; + private final TaskOutputsInternal taskOutputs; + private final TaskDestroyables taskDestroyables; + private final TaskLocalStateInternal taskLocalState; + @SuppressWarnings("deprecation") + private org.gradle.logging.LoggingManagerInternal loggingManager; + + private Set>> requiredServices; + + private void assertDynamicObject() { + if (extensibleDynamicObject == null) { + extensibleDynamicObject = new ExtensibleDynamicObject(this, identity.type, services.get(InstanceGenerator.class)); + } + } + + public static T injectIntoNewInstance(ProjectInternal project, TaskIdentity identity, Callable factory) { + NEXT_INSTANCE.set(new TaskInfo(identity, project)); + try { + return uncheckedCall(factory); + } finally { + NEXT_INSTANCE.set(null); + } + } + + @Override + public TaskStateInternal getState() { + return state; + } + + @Override + public AntBuilder getAnt() { + return project.getAnt(); + } + + @Override + public Project getProject() { + notifyProjectAccess(); + return project; + } + + @Override + public String getName() { + return identity.name; + } + + @Override + public TaskIdentity getTaskIdentity() { + return identity; + } + + @Override + public List> getActions() { + if (observableActionList == null) { + observableActionList = new ObservableActionWrapperList(getTaskActions()); + observableActionList.addPropertyChangeListener(new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + taskMutator.assertMutable("Task.getActions()", evt); + } + }); + } + return Cast.uncheckedNonnullCast(observableActionList); + } + + @Override + public List getTaskActions() { + if (actions == null) { + actions = new ArrayList(3); + } + return actions; + } + + @Override + public boolean hasTaskActions() { + return actions != null && !actions.isEmpty(); + } + + @Override + public void setActions(final List> replacements) { + taskMutator.mutate("Task.setActions(List)", new Runnable() { + @Override + public void run() { + getTaskActions().clear(); + for (Action action : replacements) { + doLast(action); + } + } + }); + } + + @Override + public TaskDependencyInternal getTaskDependencies() { + notifyTaskDependenciesAccess("Task.taskDependencies"); + return dependencies; + } + + @Override + public Set getDependsOn() { + notifyTaskDependenciesAccess("Task.dependsOn"); + return dependencies.getMutableValues(); + } + + @Override + public void setDependsOn(final Iterable dependsOn) { + taskMutator.mutate("Task.setDependsOn(Iterable)", new Runnable() { + @Override + public void run() { + dependencies.setValues(dependsOn); + } + }); + } + + @Override + public void onlyIf(final Closure onlyIfClosure) { + taskMutator.mutate("Task.onlyIf(Closure)", new Runnable() { + @Override + public void run() { + onlyIfSpec = onlyIfSpec.and(onlyIfClosure); + } + }); + } + + @Override + public void onlyIf(final Spec spec) { + taskMutator.mutate("Task.onlyIf(Spec)", new Runnable() { + @Override + public void run() { + onlyIfSpec = onlyIfSpec.and(spec); + } + }); + } + + @Override + public void setOnlyIf(final Spec spec) { + taskMutator.mutate("Task.setOnlyIf(Spec)", new Runnable() { + @Override + public void run() { + onlyIfSpec = createNewOnlyIfSpec().and(spec); + } + }); + } + + @Override + public void setOnlyIf(final Closure onlyIfClosure) { + taskMutator.mutate("Task.setOnlyIf(Closure)", new Runnable() { + @Override + public void run() { + onlyIfSpec = createNewOnlyIfSpec().and(onlyIfClosure); + } + }); + } + + private AndSpec createNewOnlyIfSpec() { + return new AndSpec(element -> element == this && enabled); + } + + @Override + public Spec getOnlyIf() { + return onlyIfSpec; + } + + @Override + public boolean getDidWork() { + return state.getDidWork(); + } + + @Override + public void setDidWork(boolean didWork) { + state.setDidWork(didWork); + } + + @Internal + public boolean isEnabled() { + return enabled; + } + + @Override + public boolean getEnabled() { + return enabled; + } + + @Override + public void setEnabled(final boolean enabled) { + taskMutator.mutate("Task.setEnabled(boolean)", ()-> { + this.enabled = enabled; + }); + } + + @Override + public boolean getImpliesSubProjects() { + return impliesSubProjects; + } + + @Override + public void setImpliesSubProjects(boolean impliesSubProjects) { + this.impliesSubProjects = impliesSubProjects; + } + + @Override + public String getPath() { + return identity.projectPath.toString(); + } + + @Override + public Path getIdentityPath() { + return identity.identityPath; + } + + @Override + public Task dependsOn(final Object... paths) { + taskMutator.mutate("Task.dependsOn(Object...)", new Runnable() { + @Override + public void run() { + dependencies.add(paths); + } + }); + return this; + } + + @Override + public Task doFirst(final Action action) { + return doFirst("doFirst {} action", action); + } + + @Override + public Task doFirst(final String actionName, final Action action) { + hasCustomActions = true; + if (action == null) { + throw new InvalidUserDataException("Action must not be null!"); + } + taskMutator.mutate("Task.doFirst(Action)", new Runnable() { + @Override + public void run() { + getTaskActions().add(0, wrap(action, actionName)); + } + }); + return this; + } + + @Override + public Task doLast(final Action action) { + return doLast("doLast {} action", action); + } + + @Override + public Task doLast(final String actionName, final Action action) { + hasCustomActions = true; + if (action == null) { + throw new InvalidUserDataException("Action must not be null!"); + } + taskMutator.mutate("Task.doLast(Action)", new Runnable() { + @Override + public void run() { + getTaskActions().add(wrap(action, actionName)); + } + }); + return this; + } + + @Override + public int compareTo(Task otherTask) { + int depthCompare = project.compareTo(otherTask.getProject()); + if (depthCompare == 0) { + return getPath().compareTo(otherTask.getPath()); + } else { + return depthCompare; + } + } + + @Override + public Logger getLogger() { + return logger; + } + + @Override + @SuppressWarnings("deprecation") + public org.gradle.logging.LoggingManagerInternal getLogging() { + if (loggingManager == null) { + loggingManager = new LoggingManagerInternalCompatibilityBridge(services.getFactory(org.gradle.internal.logging.LoggingManagerInternal.class).create()); + } + return loggingManager; + } + + @Override + public void setLoggerMessageRewriter(ContextAwareTaskLogger.MessageRewriter messageRewriter) { + logger.setMessageRewriter(messageRewriter); + } + + @Override + @SuppressWarnings("deprecation") + public org.gradle.logging.StandardOutputCapture getStandardOutputCapture() { + return getLogging(); + } + + @Override + public Object property(String propertyName) throws MissingPropertyException { + assertDynamicObject(); + return extensibleDynamicObject.getProperty(propertyName); + } + + @Override + public boolean hasProperty(String propertyName) { + assertDynamicObject(); + return extensibleDynamicObject.hasProperty(propertyName); + } + + @Override + public void setProperty(String name, Object value) { + assertDynamicObject(); + extensibleDynamicObject.setProperty(name, value); + } + + @Override + public Convention getConvention() { + assertDynamicObject(); + return extensibleDynamicObject.getConvention(); + } + + @Internal + @Override + public ExtensionContainer getExtensions() { + return getConvention(); + } + + @Internal + @Override + public DynamicObject getAsDynamicObject() { + assertDynamicObject(); + return extensibleDynamicObject; + } + + @Override + public String getDescription() { + return description; + } + + @Override + public void setDescription(String description) { + this.description = description; + } + + @Override + public String getGroup() { + return group; + } + + @Override + public void setGroup(String group) { + this.group = group; + } + + @Override + public TaskInputsInternal getInputs() { + return taskInputs; + } + + @Override + public TaskOutputsInternal getOutputs() { + return taskOutputs; + } + + @Override + public TaskDestroyables getDestroyables() { + return taskDestroyables; + } + + @Override + public TaskLocalState getLocalState() { + return taskLocalState; + } + + @Internal + protected ServiceRegistry getServices() { + return services; + } + + @Override + public Task doFirst(final Closure action) { + hasCustomActions = true; + if (action == null) { + throw new InvalidUserDataException("Action must not be null!"); + } + taskMutator.mutate("Task.doFirst(Closure)", new Runnable() { + @Override + public void run() { + getTaskActions().add(0, convertClosureToAction(action, "doFirst {} action")); + } + }); + return this; + } + + @Override + public Task doLast(final Closure action) { + hasCustomActions = true; + if (action == null) { + throw new InvalidUserDataException("Action must not be null!"); + } + taskMutator.mutate("Task.doLast(Closure)", new Runnable() { + @Override + public void run() { + getTaskActions().add(convertClosureToAction(action, "doLast {} action")); + } + }); + return this; + } + + @Override + public Task configure(Closure closure) { + return ConfigureUtil.configureSelf(closure, this); + } + + @Override + public File getTemporaryDir() { + File dir = getServices().get(TemporaryFileProvider.class).newTemporaryFile(getName()); + GFileUtils.mkdirs(dir); + return dir; + } + + // note: this method is on TaskInternal + @Override + public Factory getTemporaryDirFactory() { + // Cached during serialization so it can be isolated from this task + final Cached temporaryDir = Cached.of(this::getTemporaryDir); + return factory(temporaryDir::get); + } + + private InputChangesAwareTaskAction convertClosureToAction(Closure actionClosure, String actionName) { + return new ClosureTaskAction(actionClosure, actionName, getServices().get(UserCodeApplicationContext.class).current()); + } + + private InputChangesAwareTaskAction wrap(final Action action) { + return wrap(action, "unnamed action"); + } + + private InputChangesAwareTaskAction wrap(final Action action, String actionName) { + if (action instanceof InputChangesAwareTaskAction) { + return (InputChangesAwareTaskAction) action; + } + return new TaskActionWrapper(action, actionName); + } + + private static class TaskInfo { + private final TaskIdentity identity; + private final ProjectInternal project; + + private TaskInfo(TaskIdentity identity, ProjectInternal project) { + this.identity = identity; + this.project = project; + } + } + + private static class ClosureTaskAction implements InputChangesAwareTaskAction { + private final Closure closure; + private final String actionName; + @Nullable + private final UserCodeApplicationContext.Application application; + + private ClosureTaskAction(Closure closure, String actionName, @Nullable UserCodeApplicationContext.Application application) { + this.closure = closure; + this.actionName = actionName; + this.application = application; + } + + @Override + public void setInputChanges(InputChangesInternal inputChanges) { + } + + @Override + public void clearInputChanges() { + } + + @Override + public void execute(Task task) { + if (application == null) { + doExecute(task); + } else { + application.reapply(() -> doExecute(task)); + } + } + + private void doExecute(Task task) { + closure.setDelegate(task); + closure.setResolveStrategy(Closure.DELEGATE_FIRST); + ClassLoader original = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(closure.getClass().getClassLoader()); + try { + if (closure.getMaximumNumberOfParameters() == 0) { + closure.call(); + } else { + closure.call(task); + } + } catch (InvokerInvocationException e) { + Throwable cause = e.getCause(); + if (cause instanceof RuntimeException) { + throw (RuntimeException) cause; + } + throw e; + } finally { + Thread.currentThread().setContextClassLoader(original); + } + } + + @Override + public ImplementationSnapshot getActionImplementation(ClassLoaderHierarchyHasher hasher) { + return ImplementationSnapshot.of(getActionClassName(closure), hasher.getClassLoaderHash(closure.getClass().getClassLoader())); + } + + @Override + public String getDisplayName() { + return "Execute " + actionName; + } + } + + private static class TaskActionWrapper implements InputChangesAwareTaskAction { + private final Action action; + private final String maybeActionName; + + /** + * The action name is used to construct a human readable name for + * the actions to be used in progress logging. It is only used if + * the wrapped action does not already implement {@link Describable}. + */ + public TaskActionWrapper(Action action, String maybeActionName) { + this.action = action; + this.maybeActionName = maybeActionName; + } + + @Override + public void setInputChanges(InputChangesInternal inputChanges) { + } + + @Override + public void clearInputChanges() { + } + + @Override + public void execute(Task task) { + ClassLoader original = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(action.getClass().getClassLoader()); + try { + action.execute(task); + } finally { + Thread.currentThread().setContextClassLoader(original); + } + } + + @Override + public ImplementationSnapshot getActionImplementation(ClassLoaderHierarchyHasher hasher) { + return ImplementationSnapshot.of(getActionClassName(action), hasher.getClassLoaderHash(action.getClass().getClassLoader())); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof TaskActionWrapper)) { + return false; + } + + TaskActionWrapper that = (TaskActionWrapper) o; + return action.equals(that.action); + } + + @Override + public int hashCode() { + return action.hashCode(); + } + + @Override + public String getDisplayName() { + if (action instanceof Describable) { + return ((Describable) action).getDisplayName(); + } + return "Execute " + maybeActionName; + } + } + + private static String getActionClassName(Object action) { + if (action instanceof ScriptOrigin) { + ScriptOrigin origin = (ScriptOrigin) action; + return origin.getOriginalClassName() + "_" + origin.getContentHash(); + } else { + return action.getClass().getName(); + } + } + + @Override + public void setMustRunAfter(final Iterable mustRunAfterTasks) { + taskMutator.mutate("Task.setMustRunAfter(Iterable)", new Runnable() { + @Override + public void run() { + mustRunAfter.setValues(mustRunAfterTasks); + } + }); + } + + @Override + public Task mustRunAfter(final Object... paths) { + taskMutator.mutate("Task.mustRunAfter(Object...)", new Runnable() { + @Override + public void run() { + mustRunAfter.add(paths); + } + }); + return this; + } + + @Override + public TaskDependency getMustRunAfter() { + return mustRunAfter; + } + + @Override + public void setFinalizedBy(final Iterable finalizedByTasks) { + taskMutator.mutate("Task.setFinalizedBy(Iterable)", new Runnable() { + @Override + public void run() { + finalizedBy.setValues(finalizedByTasks); + } + }); + } + + @Override + public Task finalizedBy(final Object... paths) { + taskMutator.mutate("Task.finalizedBy(Object...)", new Runnable() { + @Override + public void run() { + finalizedBy.add(paths); + } + }); + return this; + } + + @Override + public TaskDependency getFinalizedBy() { + return finalizedBy; + } + + @Override + public TaskDependency shouldRunAfter(final Object... paths) { + taskMutator.mutate("Task.shouldRunAfter(Object...)", new Runnable() { + @Override + public void run() { + shouldRunAfter.add(paths); + } + }); + return shouldRunAfter; + } + + @Override + public void setShouldRunAfter(final Iterable shouldRunAfterTasks) { + taskMutator.mutate("Task.setShouldRunAfter(Iterable)", new Runnable() { + @Override + public void run() { + shouldRunAfter.setValues(shouldRunAfterTasks); + } + }); + } + + @Override + public TaskDependency getShouldRunAfter() { + return shouldRunAfter; + } + + private class ObservableActionWrapperList extends ObservableList { + public ObservableActionWrapperList(List delegate) { + super(delegate); + } + + @Override + public boolean add(Object action) { + if (action == null) { + throw new InvalidUserDataException("Action must not be null!"); + } + return super.add(wrap(Cast.uncheckedNonnullCast(action))); + } + + @Override + public void add(int index, Object action) { + if (action == null) { + throw new InvalidUserDataException("Action must not be null!"); + } + super.add(index, wrap(Cast.uncheckedNonnullCast(action))); + } + + @Override + public boolean addAll(Collection actions) { + if (actions == null) { + throw new InvalidUserDataException("Actions must not be null!"); + } + return super.addAll(transformToContextAwareTaskActions(Cast.uncheckedNonnullCast(actions))); + } + + @Override + public boolean addAll(int index, Collection actions) { + if (actions == null) { + throw new InvalidUserDataException("Actions must not be null!"); + } + return super.addAll(index, transformToContextAwareTaskActions(Cast.uncheckedNonnullCast(actions))); + } + + @Override + public Object set(int index, Object action) { + if (action == null) { + throw new InvalidUserDataException("Action must not be null!"); + } + return super.set(index, wrap(Cast.uncheckedNonnullCast(action))); + } + + @Override + public boolean removeAll(Collection actions) { + return super.removeAll(transformToContextAwareTaskActions(Cast.uncheckedNonnullCast(actions))); + } + + @Override + public boolean remove(Object action) { + return super.remove(wrap(Cast.uncheckedNonnullCast(action))); + } + + private Collection transformToContextAwareTaskActions(Collection c) { + return Collections2.transform(c, input -> wrap(Cast.uncheckedCast(input))); + } + } + + @Override + public void prependParallelSafeAction(final Action action) { + if (action == null) { + throw new InvalidUserDataException("Action must not be null!"); + } + getTaskActions().add(0, wrap(action)); + } + + @Override + public void appendParallelSafeAction(final Action action) { + if (action == null) { + throw new InvalidUserDataException("Action must not be null!"); + } + getTaskActions().add(wrap(action)); + } + + @Override + public boolean isHasCustomActions() { + return hasCustomActions; + } + + @Override + public Property getTimeout() { + return timeout; + } + + @Override + public void usesService(Provider> service) { + taskMutator.mutate("Task.usesService(Provider)", () -> { + if (requiredServices == null) { + requiredServices = new HashSet<>(); + } + requiredServices.add(service); + }); + } + + public Set>> getRequiredServices() { + if (requiredServices == null) { + return Collections.emptySet(); + } + return requiredServices; + } + + @Override + public List getSharedResources() { + if (requiredServices == null) { + return Collections.emptyList(); + } + com.google.common.collect.ImmutableList.Builder locks = ImmutableList.builder(); + BuildServiceRegistryInternal serviceRegistry = getServices().get(BuildServiceRegistryInternal.class); + for (Provider> service : requiredServices) { + SharedResource resource = serviceRegistry.forService(service); + if (resource.getMaxUsages() > 0) { + locks.add(resource.getResourceLock(1)); + } + } + return locks.build(); + } + + private void notifyProjectAccess() { + if (state.getExecuting()) { + getTaskExecutionAccessBroadcaster().onProjectAccess("Task.project", this); + } + } + + private void notifyTaskDependenciesAccess(String invocationDescription) { + if (state.getExecuting()) { + getTaskExecutionAccessBroadcaster().onTaskDependenciesAccess(invocationDescription, this); + } + } + + private TaskExecutionAccessListener getTaskExecutionAccessBroadcaster() { + return services.get(ListenerManager.class).getBroadcaster(TaskExecutionAccessListener.class); + } +} diff --git a/src/main/java/io/github/fvarrui/javapackager/Main.java b/src/main/java/io/github/fvarrui/javapackager/Main.java deleted file mode 100644 index 2e450091..00000000 --- a/src/main/java/io/github/fvarrui/javapackager/Main.java +++ /dev/null @@ -1,379 +0,0 @@ -package io.github.fvarrui.javapackager; - -import com.squareup.javapoet.*; -import edu.sc.seis.launch4j.tasks.Launch4jLibraryTask; -import io.github.fvarrui.javapackager.generator.*; -import io.github.fvarrui.javapackager.gradle.GradleContext; -import io.github.fvarrui.javapackager.packagers.Context; -import org.apache.commons.io.FileUtils; - -import java.io.File; -import java.io.IOException; -import java.lang.annotation.Annotation; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.Parameter; -import java.net.MalformedURLException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.concurrent.CopyOnWriteArrayList; - -import org.apache.maven.plugin.AbstractMojo; -import org.apache.maven.plugins.annotations.Mojo; -import org.gradle.api.DefaultTask; -import org.gradle.api.tasks.InputDirectory; -import org.gradle.api.tasks.InputFile; -import org.gradle.api.tasks.TaskAction; - -import javax.lang.model.element.Modifier; - -/** - * This class is temporary, and I am not sure - * if this makes into the final pull request. - */ -public class Main { - - public static void newMain(String[] args) throws IOException, ClassNotFoundException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException { - File dir = new File(System.getProperty("user.dir")+"/src/main/java/io/github/fvarrui/javapackager"); - List pluginClasses = getPluginClasses(dir); - for (PluginClassFile pluginClassFile : pluginClasses) { - generateMavenPluginClass(pluginClassFile); - generateGradlePluginClass(pluginClassFile); - } - } - - public static void main(String[] args) throws IOException { - File generatedDir = new File(System.getProperty("user.dir")+"/src/main/java/io/github/fvarrui/javapackager/generated"); - FileUtils.deleteDirectory(generatedDir); - generatedDir.mkdirs(); - File filePackageTask = new File(generatedDir.getParentFile()+"/PackageTask.java"); - List lines = new CopyOnWriteArrayList<>(Files.readAllLines(filePackageTask.toPath())); - int linesToRemove = 0; - for (String line : lines) { - if(linesToRemove > 0){ - lines.remove(line); - linesToRemove--; - } - else if(line.contains("org.gradle.api")) lines.remove(line); - else if(line.contains("if(isGradle){")){ - lines.remove(line); - linesToRemove = 4; // Remove next 4 lines - } - else if(line.contains(" Project ") || line.contains("@OutputFiles") - || line.contains("@TaskAction") || line.contains("@OutputDirectory") || line.contains("@InputDirectory") || line.contains("@Optional") - || line.contains("@InputFile") || line.contains("@Input") || line.contains("gradleProject")) - lines.remove(line); - } - - for (int i = 0; i < lines.size(); i++) { - String line = lines.get(i); - if(line.contains("extends DefaultTask")) { - line = line.replace("extends DefaultTask", ""); - lines.set(i, line); - } - if(line.contains("isGradle ?")){ - int iStart = line.indexOf("isGradle ?"); - int iEnd = line.indexOf(":"); - line = line.substring(0, iStart) + line.substring(iEnd + 1); - lines.set(i, line); - } - if(line.contains("package io.github.fvarrui.javapackager;")){ - line = line.replace("package io.github.fvarrui.javapackager;", "package io.github.fvarrui.javapackager.generated;"); - lines.set(i, line); - } - if(line.contains("PackageTask")){ - line = line.replace("PackageTask", "MavenPackageTask"); - lines.set(i, line); - } - } - - File generatedFilePackageTask = new File(generatedDir+"/MavenPackageTask.java"); - generatedFilePackageTask.createNewFile(); - Files.write(generatedFilePackageTask.toPath(), lines); - - File generatedFilePackageTaskFunctions = new File(generatedDir+"/PackageTaskFunctions.java"); - StringBuilder builder = new StringBuilder(); - builder.append("package io.github.fvarrui.javapackager.generated;\n"); - builder.append("public interface PackageTaskFunctions{\n"); - for (Method method : PackageTask.class.getMethods()) { - if(method.getModifiers() == java.lang.reflect.Modifier.PRIVATE) continue; - if(!method.getDeclaringClass().equals(PackageTask.class)) continue; - String methodString = ""; - methodString +=method.getReturnType().getName()+" "; - methodString +=method.getName()+"("; - - - String params = ""; - for (Parameter parameter : method.getParameters()) { - params += (parameter.getParameterizedType().getTypeName() - +" "+parameter.getName()+","); - } - if(!params.isEmpty()){ - params = params.substring(0, params.length()-1); - methodString +=params; - } - methodString += ")"; - methodString = methodString.replace("io.github.fvarrui.javapackager.PackageTask", - "io.github.fvarrui.javapackager.generated.PackageTaskFunctions"); - - - String exceptions = ""; - for (Class exceptionType : method.getExceptionTypes()) { - exceptions += (exceptionType.getName()+","); - } - if(!exceptions.isEmpty()){ - exceptions = exceptions.substring(0, exceptions.length()-1); - methodString += " throws "+ exceptions; - } - - - builder.append(methodString+";\n"); - } - builder.append("}\n"); - generatedFilePackageTaskFunctions.createNewFile(); - Files.write(generatedFilePackageTaskFunctions.toPath(), builder.toString().getBytes(StandardCharsets.UTF_8)); - } - - /** - * Expects a class with the {@link io.github.fvarrui.javapackager.generator.Plugin} annotation - * to generate the maven plugin class from in the desired output directory. - */ - private static void generateMavenPluginClass(PluginClassFile pluginClassFile) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { - Class pluginClass = pluginClassFile.loadClass(); - Object pluginClassInstance = pluginClass.getDeclaredConstructor().newInstance(); - Field[] fields = pluginClass.getFields(); - Plugin pluginAnnotation = pluginClass.getAnnotation(Plugin.class); - - String simpleClassName = "Maven"+pluginClass.getSimpleName(); - TypeSpec.Builder genClass = TypeSpec.classBuilder(simpleClassName) - .addJavadoc("This is a generated class thus modifying it, is not recommended." + - " Instead the actual class {@link "+pluginClass.getName()+"} should be edited.") - .addModifiers(Modifier.PUBLIC) - .superclass(AbstractMojo.class) - .addAnnotation(AnnotationSpec.builder(Mojo.class) - .addMember("name", "$L", pluginAnnotation.name()) - .addMember("defaultPhase", "$L", pluginAnnotation.defaultPhase()) - .addMember("requiresDependencyResolution", "$L", pluginAnnotation.requiresDependencyResolution()) - .build()); - - for (Field field : getFieldsWithAnnotation(fields, Input.class)) { - AnnotationSpec.Builder annotation = AnnotationSpec.builder(org.apache.maven.plugins.annotations.Parameter.class) - .addMember("property", "$L", field.getName()); - - if(field.isAnnotationPresent(Required.class)) - annotation.addMember("required", "true"); - - genClass.addField(FieldSpec.builder(field.getType(), field.getName()).addModifiers(Modifier.PRIVATE) - .addAnnotation(annotation.build()) - .initializer("$L", field.get(pluginClassInstance)).build()); - genClass.addMethod(getter(field.getType(), field.getName()).build()); - genClass.addMethod(modernSetter(field.getName()).build()); - } - - for (Field field : getFieldsWithAnnotation(fields, Output.class)) { - AnnotationSpec.Builder annotation = AnnotationSpec.builder(org.apache.maven.plugins.annotations.Parameter.class) - .addMember("property", "$L", field.getName()); - - if(field.isAnnotationPresent(Required.class)) - annotation.addMember("required", "true"); - - genClass.addField(FieldSpec.builder(field.getType(), field.getName()).addModifiers(Modifier.PRIVATE) - .addAnnotation(annotation.build()) - .initializer("$L", field.get(pluginClassInstance)).build()); - genClass.addMethod(getter(field.getType(), field.getName()).build()); - genClass.addMethod(modernSetter(field.getName()).build()); - } - - JavaFile javaFile = JavaFile.builder(pluginClassFile.packageName, genClass.build()) - .build(); - javaFile.writeTo(new File(pluginClassFile.getParentFile()+"/"+simpleClassName+".java")); - } - - /** - * Expects a class with the {@link Plugin} annotation - * to generate the gradle plugin class from in the desired output directory. - */ - private static void generateGradlePluginClass(PluginClassFile pluginClassFile) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { - Class pluginClass = pluginClassFile.loadClass(); - Object pluginClassInstance = pluginClass.getDeclaredConstructor().newInstance(); - Field[] fields = pluginClass.getFields(); - Plugin pluginAnnotation = pluginClass.getAnnotation(Plugin.class); - - String simpleClassName = "Gradle"+pluginClass.getSimpleName(); - TypeSpec.Builder genClass = TypeSpec.classBuilder(simpleClassName) - .addJavadoc("This is a generated class thus modifying it, is not recommended." + - " Instead the actual class {@link "+pluginClass.getName()+"} should be edited.") - .addModifiers(Modifier.PUBLIC) - .superclass(DefaultTask.class) - .addSuperinterface(ParameterizedTypeName.get(org.gradle.api.Plugin.class, org.gradle.api.Project.class)); - - //TypeSpec.Builder genClassInterface = TypeSpec.interfaceBuilder(pluginClass.getSimpleName() + "Methods"); - - genClass.addMethod(MethodSpec.constructorBuilder() - .addStatement("setGroup($S)", pluginAnnotation.groupName()) - .addStatement("setDescription(§S)", pluginAnnotation.description()) - .addStatement("getOutputs().upToDateWhen(o -> false)") - .build()); - - genClass.addMethod(MethodSpec.methodBuilder("apply") - .addModifiers(Modifier.PUBLIC) - .returns(void.class) - .addParameter(org.gradle.api.Project.class, "project") - .addStatement("$T.setContext(new $T(project))", Context.class, GradleContext.class) - .addCode("project.getPluginManager().apply(\"java\");\n" + - "project.getPluginManager().apply(\"edu.sc.seis.launch4j\");\n") - .addStatement(simpleClassName+" task = ("+simpleClassName+") project.getTasks().create($S, "+simpleClassName+".class).dependsOn(\"build\")", pluginAnnotation.taskName()) - .addCode("project.getExtensions().add("+pluginAnnotation.settingsExtName()+", task); // Use task instance as extension\n") - .addStatement("$T.getGradleContext().setLibraryTask(project.getTasks().create(\"launch4j_\" + UUID.randomUUID(), $T.class))", Context.class, Launch4jLibraryTask.class) - .build()); - - genClass.addMethod(MethodSpec.methodBuilder("execute") - .addModifiers(Modifier.PUBLIC) - .returns(void.class) - .addException(Exception.class) - .addAnnotation(TaskAction.class) - .addCode("Packager packager = this.createPackager();\n" + - "// generates app, installers and bundles\n" + - "File app = packager.createApp();\n" + - "List installers = packager.generateInstallers();\n" + - "List bundles = packager.createBundles();\n" + - "\n" + - "// sets generated files as output\n" + - "outputFiles = new ArrayList<>();\n" + - "outputFiles.add(app);\n" + - "outputFiles.addAll(installers);\n" + - "outputFiles.addAll(bundles);\n") - .build()); - - for (Field field : getFieldsWithAnnotation(fields, Input.class)) { - List> annotations = new ArrayList<>(); - if(field.getType().equals(File.class)) - if(field.isAnnotationPresent(Directory.class)) - annotations.add(org.gradle.api.tasks.InputDirectory.class); - else - annotations.add(org.gradle.api.tasks.InputFile.class); - else - annotations.add(org.gradle.api.tasks.Input.class); - - if(!field.isAnnotationPresent(Required.class)) - annotations.add(org.gradle.api.tasks.Optional.class); - - genClass.addField(fieldWithAnnotations(field.getType(), field.getName(), annotations).addModifiers(Modifier.PRIVATE) - .initializer("$L", field.get(pluginClassInstance)).build()); - genClass.addMethod(getter(field.getType(), field.getName()).build()); - genClass.addMethod(modernSetter(field.getName()).build()); - if(field.isAnnotationPresent(Closure.class)) - genClass.addMethod(gradleClosureSetter(field.getType(), field.getName()).build()); - } - - for (Field field : getFieldsWithAnnotation(fields, Output.class)) { - List> annotations = new ArrayList<>(); - if(field.getType().equals(File.class)) - if(field.isAnnotationPresent(Directory.class)) - annotations.add(org.gradle.api.tasks.OutputDirectory.class); - else - annotations.add(org.gradle.api.tasks.OutputFile.class); - //else - //annotations.add(org.gradle.api.tasks.Output.class); - - if(!field.isAnnotationPresent(Required.class)) - annotations.add(org.gradle.api.tasks.Optional.class); - - genClass.addField(fieldWithAnnotations(field.getType(), field.getName(), annotations).addModifiers(Modifier.PRIVATE) - .initializer("$L", field.get(pluginClassInstance)).build()); - genClass.addMethod(getter(field.getType(), field.getName()).build()); - genClass.addMethod(modernSetter(field.getName()).build()); - if(field.isAnnotationPresent(Closure.class)) - genClass.addMethod(gradleClosureSetter(field.getType(), field.getName()).build()); - } - - JavaFile javaFile = JavaFile.builder(pluginClassFile.packageName, genClass.build()) - .build(); - javaFile.writeTo(new File(pluginClassFile.getParentFile()+"/"+simpleClassName+".java")); - } - - private static MethodSpec.Builder gradleClosureSetter(Class type, String fieldName) { - return MethodSpec.methodBuilder(fieldName) - .addModifiers(Modifier.PUBLIC, Modifier.STATIC) - .returns(type) - .addParameter(ParameterSpec.builder(ParameterizedTypeName.get(groovy.lang.Closure.class, type), "closure").build()) - .addCode("this."+fieldName+" = new "+type.getName()+"();\n" + - GradleContext.class.getName()+".getGradleContext().getProject().configure("+fieldName+", closure);\n" + - "return "+fieldName+";\n"); - } - - private static FieldSpec.Builder fieldWithAnnotations(Class type, String name, List> annotations) { - FieldSpec.Builder builder = FieldSpec.builder(type, name); - if(annotations!=null) - for (Class annotation : annotations) { - builder.addAnnotation(annotation); - } - return builder; - } - - // setter for field - private static MethodSpec.Builder modernSetter(String fieldName) { - return MethodSpec.methodBuilder(fieldName) - .addModifiers(Modifier.PUBLIC) - .returns(void.class) - .addCode("this."+fieldName+" = "+fieldName+";\n"); - } - - // getter for field - private static MethodSpec.Builder getter(Class returnType, String fieldName) { - String methodName = fieldName.replaceFirst(fieldName.substring(0, 1), fieldName.substring(0, 1).toUpperCase()); - return MethodSpec.methodBuilder("get"+methodName) - .addModifiers(Modifier.PUBLIC) - .returns(returnType) - .addCode("return "+fieldName+";\n"); - } - - private static List getFieldsWithAnnotation(Field[] fields, Class annotationClass) { - List list = new ArrayList<>(); - for (Field field : fields) { - if(field.isAnnotationPresent(annotationClass)){ - list.add(field); - } - } - return list; - } - - /** - * Recursively searches the provided directory for - * files containing the {@link io.github.fvarrui.javapackager.generator.Plugin} annotation. - */ - private static List getPluginClasses(File dir) throws IOException { - if(dir.isFile()) throw new IllegalArgumentException("Parameter 'dir' must be a directory and not a file!"); - List files = new ArrayList<>(); - for (File f : dir.listFiles()) { - if(f.isDirectory()) files.addAll(getPluginClasses(f)); - else{ - List lines = Files.readAllLines(f.toPath()); - PluginClassFile pluginClassFile = null; - for (String line : lines) { - if(line.contains("io.github.fvarrui.javapackager.generator.Plugin")) { - pluginClassFile = new PluginClassFile(f.getAbsolutePath(), null, dir); - break; - } - } - if(pluginClassFile != null) { - String packageName = null; - for (String line : lines) { - if(line.contains("package")){ - packageName = line.replace("package ", "").replace(";", "").trim(); - break; - } - } - Objects.requireNonNull(packageName); - pluginClassFile.packageName = packageName; - files.add(pluginClassFile); - } - } - } - return files; - } -} diff --git a/src/main/java/io/github/fvarrui/javapackager/MavenPackageTask.java b/src/main/java/io/github/fvarrui/javapackager/MavenPackageTask.java new file mode 100644 index 00000000..3f865925 --- /dev/null +++ b/src/main/java/io/github/fvarrui/javapackager/MavenPackageTask.java @@ -0,0 +1,72 @@ +package io.github.fvarrui.javapackager; + +import io.github.fvarrui.javapackager.maven.MavenContext; +import io.github.fvarrui.javapackager.packagers.Context; +import io.github.fvarrui.javapackager.packagers.Packager; +import org.apache.maven.execution.MavenSession; +import org.apache.maven.plugin.*; +import org.apache.maven.plugin.logging.Log; +import org.apache.maven.plugin.logging.SystemStreamLog; +import org.apache.maven.plugins.annotations.Component; +import org.apache.maven.plugins.annotations.LifecyclePhase; +import org.apache.maven.plugins.annotations.Parameter; +import org.apache.maven.plugins.annotations.ResolutionScope; +import org.apache.maven.project.MavenProject; + +import java.util.Map; + +import static org.twdata.maven.mojoexecutor.MojoExecutor.executionEnvironment; + +@org.apache.maven.plugins.annotations.Mojo(name = "package", defaultPhase = LifecyclePhase.PACKAGE, requiresDependencyResolution = ResolutionScope.RUNTIME) +public class MavenPackageTask extends PackageTask implements Mojo, ContextEnabled, PackagerFactory { + @Parameter(defaultValue = "${project}", readonly = true) + private MavenProject mavenProject; + @Parameter(defaultValue = "${session}", readonly = true) + private MavenSession mavenSession; + @Component + private BuildPluginManager pluginManager; + + private Log log; + private Map pluginContext; + + @Override + public void execute() throws MojoExecutionException, MojoFailureException { + Context.setContext( + new MavenContext( + executionEnvironment(mavenProject, mavenSession, pluginManager), + getLog() + ) + ); + try { + Packager packager = this.createPackager(this); + // generate app, installers and bundles + packager.createApp(); + packager.generateInstallers(); + packager.createBundles(); + } catch (Exception e) { + throw new MojoExecutionException(e.getMessage(), e); + } + } + + public void setLog(Log log) { + this.log = log; + } + + public Log getLog() { + if (this.log == null) { + this.log = new SystemStreamLog(); + } + + return this.log; + } + + public Map getPluginContext() { + return this.pluginContext; + } + + public void setPluginContext(Map pluginContext) { + this.pluginContext = pluginContext; + } + + +} diff --git a/src/main/java/io/github/fvarrui/javapackager/PackageTask.java b/src/main/java/io/github/fvarrui/javapackager/PackageTask.java index 62526419..6df0f742 100644 --- a/src/main/java/io/github/fvarrui/javapackager/PackageTask.java +++ b/src/main/java/io/github/fvarrui/javapackager/PackageTask.java @@ -1,5 +1,10 @@ package io.github.fvarrui.javapackager; +import io.github.fvarrui.javapackager.model.*; +import org.apache.commons.lang3.StringUtils; +import org.apache.maven.plugins.annotations.Parameter; +import org.gradle.api.tasks.*; + import java.io.File; import java.util.ArrayList; import java.util.HashMap; @@ -7,50 +12,19 @@ import java.util.Map; import java.util.stream.Collectors; -import groovy.lang.Closure; -import io.github.fvarrui.javapackager.gradle.GradleContext; -import io.github.fvarrui.javapackager.gradle.PackagePlugin; -import io.github.fvarrui.javapackager.maven.MavenContext; -import io.github.fvarrui.javapackager.model.*; -import io.github.fvarrui.javapackager.packagers.*; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.SystemUtils; -import org.apache.maven.execution.MavenSession; -import org.apache.maven.plugin.*; -import org.apache.maven.plugin.logging.Log; -import org.apache.maven.plugin.logging.SystemStreamLog; -import org.apache.maven.plugins.annotations.Component; -import org.apache.maven.plugins.annotations.LifecyclePhase; -import org.apache.maven.plugins.annotations.Parameter; -import org.apache.maven.plugins.annotations.ResolutionScope; -import org.apache.maven.project.MavenProject; -import org.gradle.api.DefaultTask; -import org.gradle.api.Project; -import org.gradle.api.tasks.*; - -import static org.twdata.maven.mojoexecutor.MojoExecutor.executionEnvironment; - /** * Package task that gets detected by maven and gradle. */ -@org.apache.maven.plugins.annotations.Mojo(name = "package", defaultPhase = LifecyclePhase.PACKAGE, requiresDependencyResolution = ResolutionScope.RUNTIME) -public class PackageTask extends DefaultTask implements Mojo, ContextEnabled { + +public class PackageTask { public PackageTask() { - this.isGradle = Context.isGradle(); - this.gradleProject = (isGradle ? Context.getGradleContext().getProject() : null); - if(isGradle){ - setGroup(PackagePlugin.GROUP_NAME); - setDescription("Packages the application as a native Windows, Mac OS X or GNU/Linux executable and creates an installer"); - getOutputs().upToDateWhen(o -> false); - } - - this.outputDirectory = (isGradle ? gradleProject.getBuildDir() : new File("${project.build.directory}")); + //this.outputDirectory = (isGradle ? gradleProject.getBuildDir() : new File("${project.build.directory}")); this.platform = Platform.getCurrentPlatform(); this.bundleJre = true; this.copyDependencies = true; this.createTarball = false; this.createZipball = false; - this.description = gradleProject.getDescription(); + //this.description = gradleProject.getDescription(); // TODO maven? this.generateInstaller = true; this.linuxConfig = new LinuxConfig(); this.macConfig = new MacConfig(); @@ -58,14 +32,14 @@ public PackageTask() { this.modules = new ArrayList<>(); this.forceInstaller = false; this.mainClass = "${exec.mainClass}"; //TODO gradle? - this.appName = (isGradle ? gradleProject.getName() : "${project.name}"); - this.appDisplayName = (isGradle ? gradleProject.getName() : "${project.name}"); - this.version = (isGradle ? (String) gradleProject.getVersion() : "${project.version}"); - this.description = (isGradle ? gradleProject.getDescription(): "${project.description}"); + //this.appName = (isGradle ? gradleProject.getName() : "${project.name}"); + //this.appDisplayName = (isGradle ? gradleProject.getName() : "${project.name}"); + //this.version = (isGradle ? (String) gradleProject.getVersion() : "${project.version}"); + //this.description = (isGradle ? gradleProject.getDescription(): "${project.description}"); this.url = "${project.url}"; //TODO gradle? this.administratorRequired = false; - this.organizationName = (isGradle ? null : "${project.organization.name}"); - this.organizationUrl = (isGradle ? null : "${project.organization.url}"); + //this.organizationName = (isGradle ? null : "${project.organization.name}"); + //this.organizationUrl = (isGradle ? null : "${project.organization.url}"); this.organizationEmail = ""; this.bundleJre = false; this.customizedJre = true; @@ -81,159 +55,23 @@ public PackageTask() { this.runnableJar = null; this.copyDependencies = true; this.jreDirectoryName = "jre"; - winConfig(new WindowsConfig()); - linuxConfig(new LinuxConfig()); - macConfig(new MacConfig()); + this.winConfig = new WindowsConfig(); + this.linuxConfig = new LinuxConfig(); + this.macConfig = new MacConfig(); this.createTarball = false; this.createZipball = false; this.extra = new HashMap<>(); this.useResourcesAsWorkingDir = true; - this.assetsDir = (isGradle ? new File(gradleProject.getProjectDir(), "assets") : new File("${project.basedir}/assets")); + //this.assetsDir = (isGradle ? new File(gradleProject.getProjectDir(), "assets") : new File("${project.basedir}/assets")); this.classpath = null; this.jreMinVersion = null; - manifest(new Manifest()); + this.manifest = new Manifest(); this.additionalModulePaths = new ArrayList<>(); this.fileAssociations = null; this.packagingJdk = null; scripts(new Scripts()); } - /* - GRADLE SPECIFIC - */ - private boolean isGradle; - private Project gradleProject; - private List outputFiles; - - @OutputFiles - public List getOutputFiles() { - return outputFiles != null ? outputFiles : new ArrayList<>(); - } - - /** - * Packaging task action - * @throws Exception Throwed if something went wrong - */ - @TaskAction - public void doPackage() throws Exception { - - Packager packager = this.createPackager(); - // generates app, installers and bundles - File app = packager.createApp(); - List installers = packager.generateInstallers(); - List bundles = packager.createBundles(); - - // sets generated files as output - outputFiles = new ArrayList<>(); - outputFiles.add(app); - outputFiles.addAll(installers); - outputFiles.addAll(bundles); - - } - - /* - MAVEN SPECIFIC - */ - @Parameter(defaultValue = "${project}", readonly = true) - private MavenProject mavenProject; - @Parameter(defaultValue = "${session}", readonly = true) - private MavenSession mavenSession; - @Component - private BuildPluginManager pluginManager; - - private Log log; - private Map pluginContext; - - @Override - public void execute() throws MojoExecutionException { - Context.setContext( - new MavenContext( - executionEnvironment(mavenProject, mavenSession, pluginManager), - getLog() - ) - ); - try { - Packager packager = this.createPackager(); - // generate app, installers and bundles - packager.createApp(); - packager.generateInstallers(); - packager.createBundles(); - } catch (Exception e) { - throw new MojoExecutionException(e.getMessage(), e); - } - } - - public void setLog(Log log) { - this.log = log; - } - - public Log getLog() { - if (this.log == null) { - this.log = new SystemStreamLog(); - } - - return this.log; - } - - public Map getPluginContext() { - return this.pluginContext; - } - - public void setPluginContext(Map pluginContext) { - this.pluginContext = pluginContext; - } - - public Packager createPackager(){ - Packager packager = null; - switch (platform) { - case mac: - packager = new MacPackager(this); break; - case linux: - packager = new LinuxPackager(this); break; - case windows: - packager = new WindowsPackager(this); break; - default: - throw new RuntimeException("Unsupported operating system: " + SystemUtils.OS_NAME + " " + SystemUtils.OS_VERSION + " " + SystemUtils.OS_ARCH); - } - return packager; - } - - /* - CONFIGURATION OF TASK - */ - - // GRADLE SPECIFIC START - public LinuxConfig linuxConfig(Closure closure) { - linuxConfig = new LinuxConfig(); - GradleContext.getGradleContext().getProject().configure(linuxConfig, closure); - return linuxConfig; - } - - public MacConfig macConfig(Closure closure) { - macConfig = new MacConfig(); - gradleProject.configure(macConfig, closure); - return macConfig; - } - - public WindowsConfig winConfig(Closure closure) { - winConfig = new WindowsConfig(); - gradleProject.configure(winConfig, closure); - return winConfig; - } - - public Manifest manifest(Closure closure) { - manifest = new Manifest(); - gradleProject.configure(manifest, closure); - return manifest; - } - - public Scripts scripts(Closure closure) { - scripts = new Scripts(); - gradleProject.configure(scripts, closure); - return scripts; - } - // GRADLE SPECIFIC END - /** * Output directory. */ diff --git a/src/main/java/io/github/fvarrui/javapackager/PackagerFactory.java b/src/main/java/io/github/fvarrui/javapackager/PackagerFactory.java new file mode 100644 index 00000000..456a7208 --- /dev/null +++ b/src/main/java/io/github/fvarrui/javapackager/PackagerFactory.java @@ -0,0 +1,25 @@ +package io.github.fvarrui.javapackager; + +import io.github.fvarrui.javapackager.model.Platform; +import io.github.fvarrui.javapackager.packagers.LinuxPackager; +import io.github.fvarrui.javapackager.packagers.MacPackager; +import io.github.fvarrui.javapackager.packagers.Packager; +import io.github.fvarrui.javapackager.packagers.WindowsPackager; +import org.apache.commons.lang3.SystemUtils; + +public interface PackagerFactory { + default Packager createPackager(PackageTask task){ + Packager packager = null; + switch (Platform.getCurrentPlatform()) { + case mac: + packager = new MacPackager(task); break; + case linux: + packager = new LinuxPackager(task); break; + case windows: + packager = new WindowsPackager(task); break; + default: + throw new RuntimeException("Unsupported operating system: " + SystemUtils.OS_NAME + " " + SystemUtils.OS_VERSION + " " + SystemUtils.OS_ARCH); + } + return packager; + } +} diff --git a/src/main/java/io/github/fvarrui/javapackager/generator/Closure.java b/src/main/java/io/github/fvarrui/javapackager/generator/Closure.java deleted file mode 100644 index 6332e863..00000000 --- a/src/main/java/io/github/fvarrui/javapackager/generator/Closure.java +++ /dev/null @@ -1,4 +0,0 @@ -package io.github.fvarrui.javapackager.generator; - -public @interface Closure { -} diff --git a/src/main/java/io/github/fvarrui/javapackager/generator/Directory.java b/src/main/java/io/github/fvarrui/javapackager/generator/Directory.java deleted file mode 100644 index bae1c11d..00000000 --- a/src/main/java/io/github/fvarrui/javapackager/generator/Directory.java +++ /dev/null @@ -1,4 +0,0 @@ -package io.github.fvarrui.javapackager.generator; - -public @interface Directory { -} diff --git a/src/main/java/io/github/fvarrui/javapackager/generator/Input.java b/src/main/java/io/github/fvarrui/javapackager/generator/Input.java deleted file mode 100644 index 428d9542..00000000 --- a/src/main/java/io/github/fvarrui/javapackager/generator/Input.java +++ /dev/null @@ -1,4 +0,0 @@ -package io.github.fvarrui.javapackager.generator; - -public @interface Input { -} diff --git a/src/main/java/io/github/fvarrui/javapackager/generator/Output.java b/src/main/java/io/github/fvarrui/javapackager/generator/Output.java deleted file mode 100644 index 02d0b227..00000000 --- a/src/main/java/io/github/fvarrui/javapackager/generator/Output.java +++ /dev/null @@ -1,4 +0,0 @@ -package io.github.fvarrui.javapackager.generator; - -public @interface Output { -} diff --git a/src/main/java/io/github/fvarrui/javapackager/generator/Plugin.java b/src/main/java/io/github/fvarrui/javapackager/generator/Plugin.java deleted file mode 100644 index a452ba37..00000000 --- a/src/main/java/io/github/fvarrui/javapackager/generator/Plugin.java +++ /dev/null @@ -1,54 +0,0 @@ -package io.github.fvarrui.javapackager.generator; - -import org.apache.maven.plugins.annotations.InstantiationStrategy; -import org.apache.maven.plugins.annotations.LifecyclePhase; -import org.apache.maven.plugins.annotations.ResolutionScope; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Documented -@Retention(RetentionPolicy.CLASS) -@Target({ElementType.TYPE}) -@Inherited -public @interface Plugin { - - // MAVEN: - String name(); - - LifecyclePhase defaultPhase() default LifecyclePhase.NONE; - - ResolutionScope requiresDependencyResolution() default ResolutionScope.NONE; - - ResolutionScope requiresDependencyCollection() default ResolutionScope.NONE; - - InstantiationStrategy instantiationStrategy() default InstantiationStrategy.PER_LOOKUP; - - String executionStrategy() default "once-per-session"; - - boolean requiresProject() default true; - - boolean requiresReports() default false; - - boolean aggregator() default false; - - boolean requiresDirectInvocation() default false; - - boolean requiresOnline() default false; - - boolean inheritByDefault() default true; - - String configurator() default ""; - - boolean threadSafe() default false; - - // GRADLE: - String groupName() default "JavaPackager"; - String settingsExtName() default "javapackager"; - String taskName() default "package"; - String description() default "Packages the application as a native Windows, Mac OS X or GNU/Linux executable and creates an installer."; -} diff --git a/src/main/java/io/github/fvarrui/javapackager/generator/PluginClassFile.java b/src/main/java/io/github/fvarrui/javapackager/generator/PluginClassFile.java deleted file mode 100644 index ebf27a1b..00000000 --- a/src/main/java/io/github/fvarrui/javapackager/generator/PluginClassFile.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.github.fvarrui.javapackager.generator; - -import org.jetbrains.annotations.NotNull; - -import java.io.File; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLClassLoader; - -public class PluginClassFile extends File { - public String packageName; - public File baseDir; - - public PluginClassFile(@NotNull String pathname, String packageName, File baseDir) { - super(pathname); - this.packageName = packageName; - this.baseDir = baseDir; - } - - public Class loadClass() throws MalformedURLException, ClassNotFoundException { - URL url = baseDir.toURI().toURL(); - URL[] urls = new URL[]{url}; - ClassLoader cl = new URLClassLoader(urls); - return cl.loadClass(packageName); - } -} diff --git a/src/main/java/io/github/fvarrui/javapackager/generator/Required.java b/src/main/java/io/github/fvarrui/javapackager/generator/Required.java deleted file mode 100644 index 2b088d54..00000000 --- a/src/main/java/io/github/fvarrui/javapackager/generator/Required.java +++ /dev/null @@ -1,4 +0,0 @@ -package io.github.fvarrui.javapackager.generator; - -public @interface Required { -} diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePlugin.java b/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePlugin.java index 75925aa0..b1fcfba0 100644 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePlugin.java +++ b/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePlugin.java @@ -1,6 +1,7 @@ package io.github.fvarrui.javapackager.gradle; import edu.sc.seis.launch4j.tasks.Launch4jLibraryTask; +import io.github.fvarrui.javapackager.GradlePackageTask; import io.github.fvarrui.javapackager.PackageTask; import io.github.fvarrui.javapackager.packagers.Context; import org.gradle.api.Plugin; @@ -28,7 +29,7 @@ public void apply(Project project) { project.getPluginManager().apply("java"); project.getPluginManager().apply("edu.sc.seis.launch4j"); - PackageTask task = (PackageTask) project.getTasks().create(PACKAGE_TASK_NAME, PackageTask.class).dependsOn("build"); + GradlePackageTask task = (GradlePackageTask) project.getTasks().create(PACKAGE_TASK_NAME, GradlePackageTask.class).dependsOn("build"); project.getExtensions().add(SETTINGS_EXT_NAME, task); // Use task instance as extension Context.getGradleContext().setLibraryTask(project.getTasks().create("launch4j_" + UUID.randomUUID(), Launch4jLibraryTask.class)); diff --git a/src/test/java/io/github/fvarrui/javapackager/MainTest.java b/src/test/java/io/github/fvarrui/javapackager/MainTest.java deleted file mode 100644 index ca65e6c7..00000000 --- a/src/test/java/io/github/fvarrui/javapackager/MainTest.java +++ /dev/null @@ -1,62 +0,0 @@ -package io.github.fvarrui.javapackager; - -import com.squareup.javapoet.*; -import edu.sc.seis.launch4j.tasks.Launch4jLibraryTask; -import io.github.fvarrui.javapackager.generator.*; -import io.github.fvarrui.javapackager.gradle.GradleContext; -import io.github.fvarrui.javapackager.packagers.Context; -import org.apache.maven.plugin.Mojo; -import org.gradle.api.DefaultTask; -import org.junit.jupiter.api.Test; - -import javax.lang.model.element.Modifier; -import java.io.File; -import java.io.IOException; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; - -class MainTest { - - @Test - void aa() throws IOException { - String simpleClassName = "GradlePackageTask"; - TypeSpec.Builder genClass = TypeSpec.classBuilder(simpleClassName) - .addJavadoc("This is a generated class thus modifying it, is not recommended." + - " Instead the actual class {@link ...} should be edited.") - .addModifiers(Modifier.PUBLIC) - .superclass(DefaultTask.class) - .addSuperinterface(ParameterizedTypeName.get(org.gradle.api.Plugin.class, org.gradle.api.Project.class)) - .addAnnotation(AnnotationSpec.builder(Mojo.class) - .addMember("name", "pluginAnnotation.name()") - .addMember("defaultPhase", "pluginAnnotation.defaultPhase().id()") - .addMember("requiresDependencyResolution", "pluginAnnotation.requiresDependencyResolution().id()") - .build()); - - //TypeSpec.Builder genClassInterface = TypeSpec.interfaceBuilder(pluginClass.getSimpleName() + "Methods"); - - genClass.addMethod(MethodSpec.constructorBuilder() - .addStatement("setGroup($S)", "pluginAnnotation.groupName()") - .addStatement("setDescription(§S)", "pluginAnnotation.description()") - .addStatement("getOutputs().upToDateWhen(o -> false)") - .build()); - - genClass.addMethod(MethodSpec.methodBuilder("apply") - .addModifiers(Modifier.PUBLIC) - .returns(void.class) - .addParameter(org.gradle.api.Project.class, "project") - .addStatement("$T.setContext(new $T(project))", Context.class, GradleContext.class) - .addCode("project.getPluginManager().apply(\"java\");\n" + - "\t\tproject.getPluginManager().apply(\"edu.sc.seis.launch4j\");\n") - .addStatement(simpleClassName+" task = ("+simpleClassName+") project.getTasks().create($S, "+simpleClassName+".class).dependsOn(\"build\")", "pluginAnnotation.taskName()") - .addCode("project.getExtensions().add(pluginAnnotation.settingsExtName(), task); // Use task instance as extension\n") - .addStatement("$T.getGradleContext().setLibraryTask(project.getTasks().create(\"launch4j_\" + UUID.randomUUID(), $T.class))", Context.class, Launch4jLibraryTask.class) - .build()); - - JavaFile javaFile = JavaFile.builder("com.my.package", genClass.build()) - .build(); - javaFile.writeTo(System.out); - } -} \ No newline at end of file From b6dd093ff51277af588eb18ce8c63c457d51e7ab Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Fri, 19 Aug 2022 17:56:23 +0200 Subject: [PATCH 48/74] fix gradle issues --- .../javapackager/GradlePackageTask.java | 997 +----------------- .../fvarrui/javapackager/PackagerFactory.java | 2 +- .../javapackager/gradle/PackagePlugin.java | 7 +- test/hello-world-gradle/build.gradle | 98 +- 4 files changed, 101 insertions(+), 1003 deletions(-) diff --git a/src/main/java/io/github/fvarrui/javapackager/GradlePackageTask.java b/src/main/java/io/github/fvarrui/javapackager/GradlePackageTask.java index e7f1ac75..1c18f0ec 100644 --- a/src/main/java/io/github/fvarrui/javapackager/GradlePackageTask.java +++ b/src/main/java/io/github/fvarrui/javapackager/GradlePackageTask.java @@ -1,119 +1,53 @@ package io.github.fvarrui.javapackager; -import com.google.common.collect.Collections2; -import com.google.common.collect.ImmutableList; import groovy.lang.Closure; -import groovy.lang.MissingPropertyException; -import groovy.util.ObservableList; import io.github.fvarrui.javapackager.gradle.GradleContext; import io.github.fvarrui.javapackager.gradle.PackagePlugin; import io.github.fvarrui.javapackager.model.*; import io.github.fvarrui.javapackager.packagers.Context; import io.github.fvarrui.javapackager.packagers.Packager; -import org.codehaus.groovy.runtime.InvokerInvocationException; import org.gradle.api.*; -import org.gradle.api.internal.DynamicObjectAware; -import org.gradle.api.internal.TaskInputsInternal; -import org.gradle.api.internal.TaskInternal; -import org.gradle.api.internal.TaskOutputsInternal; -import org.gradle.api.internal.file.FileCollectionFactory; -import org.gradle.api.internal.file.TemporaryFileProvider; -import org.gradle.api.internal.project.ProjectInternal; -import org.gradle.api.internal.project.taskfactory.TaskIdentity; -import org.gradle.api.internal.tasks.*; -import org.gradle.api.internal.tasks.execution.TaskExecutionAccessListener; -import org.gradle.api.internal.tasks.properties.PropertyWalker; -import org.gradle.api.logging.Logger; -import org.gradle.api.logging.Logging; -import org.gradle.api.plugins.Convention; -import org.gradle.api.plugins.ExtensionContainer; -import org.gradle.api.provider.Property; -import org.gradle.api.provider.Provider; -import org.gradle.api.services.BuildService; -import org.gradle.api.services.internal.BuildServiceRegistryInternal; -import org.gradle.api.specs.AndSpec; -import org.gradle.api.specs.Spec; import org.gradle.api.tasks.*; -import org.gradle.configuration.internal.UserCodeApplicationContext; -import org.gradle.internal.Cast; -import org.gradle.internal.Factory; -import org.gradle.internal.event.ListenerManager; -import org.gradle.internal.execution.history.changes.InputChangesInternal; -import org.gradle.internal.extensibility.ExtensibleDynamicObject; -import org.gradle.internal.hash.ClassLoaderHierarchyHasher; -import org.gradle.internal.impldep.com.google.common.collect.ImmutableSet; -import org.gradle.internal.instantiation.InstanceGenerator; -import org.gradle.internal.logging.compatbridge.LoggingManagerInternalCompatibilityBridge; -import org.gradle.internal.logging.slf4j.ContextAwareTaskLogger; -import org.gradle.internal.logging.slf4j.DefaultContextAwareTaskLogger; -import org.gradle.internal.metaobject.DynamicObject; -import org.gradle.internal.resources.ResourceLock; -import org.gradle.internal.resources.SharedResource; -import org.gradle.internal.scripts.ScriptOrigin; -import org.gradle.internal.serialization.Cached; -import org.gradle.internal.service.ServiceRegistry; -import org.gradle.internal.snapshot.impl.ImplementationSnapshot; -import org.gradle.util.ConfigureUtil; -import org.gradle.util.GFileUtils; -import org.gradle.util.Path; -import javax.annotation.Nullable; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; import java.io.File; -import java.time.Duration; +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; import java.util.*; -import java.util.concurrent.Callable; -import static org.gradle.api.internal.lambdas.SerializableLambdas.factory; -import static org.gradle.util.GUtil.uncheckedCall; - -public class GradlePackageTask extends PackageTask implements TaskInternal, DynamicObjectAware, Task, PackagerFactory { +public class GradlePackageTask extends DefaultTask implements PackagerFactory { + public PackageTask extension = new PackageTask(); private final Project gradleProject = Context.getGradleContext().getProject(); private List outputFiles; - public GradlePackageTask() { - - // AbstractTask.class start - TaskInfo taskInfo = NEXT_INSTANCE.get(); - if (taskInfo == null) { - throw new TaskInstantiationException(String.format("Task of type '%s' has been instantiated directly which is not supported. Tasks can only be created using the Gradle API or DSL.", getClass().getName())); - } - this.identity = taskInfo.identity; - this.project = taskInfo.project; - assert project != null; - assert identity.name != null; - this.state = new TaskStateInternal(); - TaskContainerInternal tasks = project.getTasks(); - this.mustRunAfter = new DefaultTaskDependency(tasks); - this.finalizedBy = new DefaultTaskDependency(tasks); - this.shouldRunAfter = new DefaultTaskDependency(tasks); - this.services = project.getServices(); - PropertyWalker propertyWalker = services.get(PropertyWalker.class); - FileCollectionFactory fileCollectionFactory = services.get(FileCollectionFactory.class); - taskMutator = new TaskMutator(this); - taskInputs = new DefaultTaskInputs(this, taskMutator, propertyWalker, fileCollectionFactory); - taskOutputs = new DefaultTaskOutputs(this, taskMutator, propertyWalker, fileCollectionFactory); - taskDestroyables = new DefaultTaskDestroyables(taskMutator, fileCollectionFactory); - taskLocalState = new DefaultTaskLocalState(taskMutator, fileCollectionFactory); - this.dependencies = new DefaultTaskDependency(tasks, ImmutableSet.of(taskInputs)); - this.timeout = project.getObjects().property(Duration.class); - // AbstractTask.class end - + public GradlePackageTask() throws IllegalAccessException { setGroup(PackagePlugin.GROUP_NAME); setDescription("Packages the application as a native Windows, Mac OS X or GNU/Linux executable and creates an installer"); getOutputs().upToDateWhen(o -> false); + updateExtension(extension); + } + public void updateExtension(PackageTask extension){ + this.extension = extension; // Defaults specific to gradle - this.outputDirectory = gradleProject.getBuildDir(); - this.description = gradleProject.getDescription(); - this.appName = gradleProject.getName(); - this.appDisplayName = gradleProject.getName(); - this.version = gradleProject.getVersion().toString(); - this.description = gradleProject.getDescription(); - this.organizationName = null; - this.organizationUrl = null; - this.assetsDir = new File(gradleProject.getProjectDir(), "assets"); + this.extension.outputDirectory = gradleProject.getBuildDir(); + this.extension.description = gradleProject.getDescription(); + this.extension.appName = gradleProject.getName(); + this.extension.appDisplayName = gradleProject.getName(); + this.extension.version = gradleProject.getVersion().toString(); + this.extension.description = gradleProject.getDescription(); + this.extension.organizationName = null; + this.extension.organizationUrl = null; + this.extension.assetsDir = new File(gradleProject.getProjectDir(), "assets"); + } + + private List getFieldsWithAnnotation(Field[] fields, Class annotationClass) { + List list = new ArrayList<>(); + for (Field field : fields) { + if(field.isAnnotationPresent(annotationClass)){ + list.add(field); + } + } + return list; } @OutputFiles @@ -128,7 +62,7 @@ public List getOutputFiles() { @TaskAction public void doPackage() throws Exception { - Packager packager = this.createPackager(this); + Packager packager = this.createPackager(extension); // generates app, installers and bundles File app = packager.createApp(); List installers = packager.generateInstallers(); @@ -143,876 +77,33 @@ public void doPackage() throws Exception { } public LinuxConfig linuxConfig(Closure closure) { - linuxConfig = new LinuxConfig(); - GradleContext.getGradleContext().getProject().configure(linuxConfig, closure); - return linuxConfig; + extension.linuxConfig = new LinuxConfig(); + GradleContext.getGradleContext().getProject().configure(extension.linuxConfig, closure); + return extension.linuxConfig; } public MacConfig macConfig(Closure closure) { - macConfig = new MacConfig(); - gradleProject.configure(macConfig, closure); - return macConfig; + extension.macConfig = new MacConfig(); + gradleProject.configure(extension.macConfig, closure); + return extension.macConfig; } public WindowsConfig winConfig(Closure closure) { - winConfig = new WindowsConfig(); - gradleProject.configure(winConfig, closure); - return winConfig; + extension.winConfig = new WindowsConfig(); + gradleProject.configure(extension.winConfig, closure); + return extension.winConfig; } public Manifest manifest(Closure closure) { - manifest = new Manifest(); - gradleProject.configure(manifest, closure); - return manifest; + extension.manifest = new Manifest(); + gradleProject.configure(extension.manifest, closure); + return extension.manifest; } public Scripts scripts(Closure closure) { - scripts = new Scripts(); - gradleProject.configure(scripts, closure); - return scripts; - } - - /* - FROM ABSTRACTTASK.CLASS - */ - - private static final Logger BUILD_LOGGER = Logging.getLogger(Task.class); - private static final ThreadLocal NEXT_INSTANCE = new ThreadLocal(); - - private final TaskIdentity identity; - - private final ProjectInternal project; - - private List actions; - - private boolean enabled = true; - - private final DefaultTaskDependency dependencies; - - private final DefaultTaskDependency mustRunAfter; - - private final DefaultTaskDependency finalizedBy; - - private final DefaultTaskDependency shouldRunAfter; - - private ExtensibleDynamicObject extensibleDynamicObject; - - private String description; - - private String group; - - private final Property timeout; - - private AndSpec onlyIfSpec = createNewOnlyIfSpec(); - - private final ServiceRegistry services; - - private final TaskStateInternal state; - - private final ContextAwareTaskLogger logger = new DefaultContextAwareTaskLogger(BUILD_LOGGER); - - private final TaskMutator taskMutator; - private ObservableList observableActionList; - private boolean impliesSubProjects; - private boolean hasCustomActions; - - private final TaskInputsInternal taskInputs; - private final TaskOutputsInternal taskOutputs; - private final TaskDestroyables taskDestroyables; - private final TaskLocalStateInternal taskLocalState; - @SuppressWarnings("deprecation") - private org.gradle.logging.LoggingManagerInternal loggingManager; - - private Set>> requiredServices; - - private void assertDynamicObject() { - if (extensibleDynamicObject == null) { - extensibleDynamicObject = new ExtensibleDynamicObject(this, identity.type, services.get(InstanceGenerator.class)); - } - } - - public static T injectIntoNewInstance(ProjectInternal project, TaskIdentity identity, Callable factory) { - NEXT_INSTANCE.set(new TaskInfo(identity, project)); - try { - return uncheckedCall(factory); - } finally { - NEXT_INSTANCE.set(null); - } - } - - @Override - public TaskStateInternal getState() { - return state; - } - - @Override - public AntBuilder getAnt() { - return project.getAnt(); - } - - @Override - public Project getProject() { - notifyProjectAccess(); - return project; - } - - @Override - public String getName() { - return identity.name; - } - - @Override - public TaskIdentity getTaskIdentity() { - return identity; - } - - @Override - public List> getActions() { - if (observableActionList == null) { - observableActionList = new ObservableActionWrapperList(getTaskActions()); - observableActionList.addPropertyChangeListener(new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - taskMutator.assertMutable("Task.getActions()", evt); - } - }); - } - return Cast.uncheckedNonnullCast(observableActionList); - } - - @Override - public List getTaskActions() { - if (actions == null) { - actions = new ArrayList(3); - } - return actions; - } - - @Override - public boolean hasTaskActions() { - return actions != null && !actions.isEmpty(); - } - - @Override - public void setActions(final List> replacements) { - taskMutator.mutate("Task.setActions(List)", new Runnable() { - @Override - public void run() { - getTaskActions().clear(); - for (Action action : replacements) { - doLast(action); - } - } - }); - } - - @Override - public TaskDependencyInternal getTaskDependencies() { - notifyTaskDependenciesAccess("Task.taskDependencies"); - return dependencies; - } - - @Override - public Set getDependsOn() { - notifyTaskDependenciesAccess("Task.dependsOn"); - return dependencies.getMutableValues(); + extension.scripts = new Scripts(); + gradleProject.configure(extension.scripts, closure); + return extension.scripts; } - @Override - public void setDependsOn(final Iterable dependsOn) { - taskMutator.mutate("Task.setDependsOn(Iterable)", new Runnable() { - @Override - public void run() { - dependencies.setValues(dependsOn); - } - }); - } - - @Override - public void onlyIf(final Closure onlyIfClosure) { - taskMutator.mutate("Task.onlyIf(Closure)", new Runnable() { - @Override - public void run() { - onlyIfSpec = onlyIfSpec.and(onlyIfClosure); - } - }); - } - - @Override - public void onlyIf(final Spec spec) { - taskMutator.mutate("Task.onlyIf(Spec)", new Runnable() { - @Override - public void run() { - onlyIfSpec = onlyIfSpec.and(spec); - } - }); - } - - @Override - public void setOnlyIf(final Spec spec) { - taskMutator.mutate("Task.setOnlyIf(Spec)", new Runnable() { - @Override - public void run() { - onlyIfSpec = createNewOnlyIfSpec().and(spec); - } - }); - } - - @Override - public void setOnlyIf(final Closure onlyIfClosure) { - taskMutator.mutate("Task.setOnlyIf(Closure)", new Runnable() { - @Override - public void run() { - onlyIfSpec = createNewOnlyIfSpec().and(onlyIfClosure); - } - }); - } - - private AndSpec createNewOnlyIfSpec() { - return new AndSpec(element -> element == this && enabled); - } - - @Override - public Spec getOnlyIf() { - return onlyIfSpec; - } - - @Override - public boolean getDidWork() { - return state.getDidWork(); - } - - @Override - public void setDidWork(boolean didWork) { - state.setDidWork(didWork); - } - - @Internal - public boolean isEnabled() { - return enabled; - } - - @Override - public boolean getEnabled() { - return enabled; - } - - @Override - public void setEnabled(final boolean enabled) { - taskMutator.mutate("Task.setEnabled(boolean)", ()-> { - this.enabled = enabled; - }); - } - - @Override - public boolean getImpliesSubProjects() { - return impliesSubProjects; - } - - @Override - public void setImpliesSubProjects(boolean impliesSubProjects) { - this.impliesSubProjects = impliesSubProjects; - } - - @Override - public String getPath() { - return identity.projectPath.toString(); - } - - @Override - public Path getIdentityPath() { - return identity.identityPath; - } - - @Override - public Task dependsOn(final Object... paths) { - taskMutator.mutate("Task.dependsOn(Object...)", new Runnable() { - @Override - public void run() { - dependencies.add(paths); - } - }); - return this; - } - - @Override - public Task doFirst(final Action action) { - return doFirst("doFirst {} action", action); - } - - @Override - public Task doFirst(final String actionName, final Action action) { - hasCustomActions = true; - if (action == null) { - throw new InvalidUserDataException("Action must not be null!"); - } - taskMutator.mutate("Task.doFirst(Action)", new Runnable() { - @Override - public void run() { - getTaskActions().add(0, wrap(action, actionName)); - } - }); - return this; - } - - @Override - public Task doLast(final Action action) { - return doLast("doLast {} action", action); - } - - @Override - public Task doLast(final String actionName, final Action action) { - hasCustomActions = true; - if (action == null) { - throw new InvalidUserDataException("Action must not be null!"); - } - taskMutator.mutate("Task.doLast(Action)", new Runnable() { - @Override - public void run() { - getTaskActions().add(wrap(action, actionName)); - } - }); - return this; - } - - @Override - public int compareTo(Task otherTask) { - int depthCompare = project.compareTo(otherTask.getProject()); - if (depthCompare == 0) { - return getPath().compareTo(otherTask.getPath()); - } else { - return depthCompare; - } - } - - @Override - public Logger getLogger() { - return logger; - } - - @Override - @SuppressWarnings("deprecation") - public org.gradle.logging.LoggingManagerInternal getLogging() { - if (loggingManager == null) { - loggingManager = new LoggingManagerInternalCompatibilityBridge(services.getFactory(org.gradle.internal.logging.LoggingManagerInternal.class).create()); - } - return loggingManager; - } - - @Override - public void setLoggerMessageRewriter(ContextAwareTaskLogger.MessageRewriter messageRewriter) { - logger.setMessageRewriter(messageRewriter); - } - - @Override - @SuppressWarnings("deprecation") - public org.gradle.logging.StandardOutputCapture getStandardOutputCapture() { - return getLogging(); - } - - @Override - public Object property(String propertyName) throws MissingPropertyException { - assertDynamicObject(); - return extensibleDynamicObject.getProperty(propertyName); - } - - @Override - public boolean hasProperty(String propertyName) { - assertDynamicObject(); - return extensibleDynamicObject.hasProperty(propertyName); - } - - @Override - public void setProperty(String name, Object value) { - assertDynamicObject(); - extensibleDynamicObject.setProperty(name, value); - } - - @Override - public Convention getConvention() { - assertDynamicObject(); - return extensibleDynamicObject.getConvention(); - } - - @Internal - @Override - public ExtensionContainer getExtensions() { - return getConvention(); - } - - @Internal - @Override - public DynamicObject getAsDynamicObject() { - assertDynamicObject(); - return extensibleDynamicObject; - } - - @Override - public String getDescription() { - return description; - } - - @Override - public void setDescription(String description) { - this.description = description; - } - - @Override - public String getGroup() { - return group; - } - - @Override - public void setGroup(String group) { - this.group = group; - } - - @Override - public TaskInputsInternal getInputs() { - return taskInputs; - } - - @Override - public TaskOutputsInternal getOutputs() { - return taskOutputs; - } - - @Override - public TaskDestroyables getDestroyables() { - return taskDestroyables; - } - - @Override - public TaskLocalState getLocalState() { - return taskLocalState; - } - - @Internal - protected ServiceRegistry getServices() { - return services; - } - - @Override - public Task doFirst(final Closure action) { - hasCustomActions = true; - if (action == null) { - throw new InvalidUserDataException("Action must not be null!"); - } - taskMutator.mutate("Task.doFirst(Closure)", new Runnable() { - @Override - public void run() { - getTaskActions().add(0, convertClosureToAction(action, "doFirst {} action")); - } - }); - return this; - } - - @Override - public Task doLast(final Closure action) { - hasCustomActions = true; - if (action == null) { - throw new InvalidUserDataException("Action must not be null!"); - } - taskMutator.mutate("Task.doLast(Closure)", new Runnable() { - @Override - public void run() { - getTaskActions().add(convertClosureToAction(action, "doLast {} action")); - } - }); - return this; - } - - @Override - public Task configure(Closure closure) { - return ConfigureUtil.configureSelf(closure, this); - } - - @Override - public File getTemporaryDir() { - File dir = getServices().get(TemporaryFileProvider.class).newTemporaryFile(getName()); - GFileUtils.mkdirs(dir); - return dir; - } - - // note: this method is on TaskInternal - @Override - public Factory getTemporaryDirFactory() { - // Cached during serialization so it can be isolated from this task - final Cached temporaryDir = Cached.of(this::getTemporaryDir); - return factory(temporaryDir::get); - } - - private InputChangesAwareTaskAction convertClosureToAction(Closure actionClosure, String actionName) { - return new ClosureTaskAction(actionClosure, actionName, getServices().get(UserCodeApplicationContext.class).current()); - } - - private InputChangesAwareTaskAction wrap(final Action action) { - return wrap(action, "unnamed action"); - } - - private InputChangesAwareTaskAction wrap(final Action action, String actionName) { - if (action instanceof InputChangesAwareTaskAction) { - return (InputChangesAwareTaskAction) action; - } - return new TaskActionWrapper(action, actionName); - } - - private static class TaskInfo { - private final TaskIdentity identity; - private final ProjectInternal project; - - private TaskInfo(TaskIdentity identity, ProjectInternal project) { - this.identity = identity; - this.project = project; - } - } - - private static class ClosureTaskAction implements InputChangesAwareTaskAction { - private final Closure closure; - private final String actionName; - @Nullable - private final UserCodeApplicationContext.Application application; - - private ClosureTaskAction(Closure closure, String actionName, @Nullable UserCodeApplicationContext.Application application) { - this.closure = closure; - this.actionName = actionName; - this.application = application; - } - - @Override - public void setInputChanges(InputChangesInternal inputChanges) { - } - - @Override - public void clearInputChanges() { - } - - @Override - public void execute(Task task) { - if (application == null) { - doExecute(task); - } else { - application.reapply(() -> doExecute(task)); - } - } - - private void doExecute(Task task) { - closure.setDelegate(task); - closure.setResolveStrategy(Closure.DELEGATE_FIRST); - ClassLoader original = Thread.currentThread().getContextClassLoader(); - Thread.currentThread().setContextClassLoader(closure.getClass().getClassLoader()); - try { - if (closure.getMaximumNumberOfParameters() == 0) { - closure.call(); - } else { - closure.call(task); - } - } catch (InvokerInvocationException e) { - Throwable cause = e.getCause(); - if (cause instanceof RuntimeException) { - throw (RuntimeException) cause; - } - throw e; - } finally { - Thread.currentThread().setContextClassLoader(original); - } - } - - @Override - public ImplementationSnapshot getActionImplementation(ClassLoaderHierarchyHasher hasher) { - return ImplementationSnapshot.of(getActionClassName(closure), hasher.getClassLoaderHash(closure.getClass().getClassLoader())); - } - - @Override - public String getDisplayName() { - return "Execute " + actionName; - } - } - - private static class TaskActionWrapper implements InputChangesAwareTaskAction { - private final Action action; - private final String maybeActionName; - - /** - * The action name is used to construct a human readable name for - * the actions to be used in progress logging. It is only used if - * the wrapped action does not already implement {@link Describable}. - */ - public TaskActionWrapper(Action action, String maybeActionName) { - this.action = action; - this.maybeActionName = maybeActionName; - } - - @Override - public void setInputChanges(InputChangesInternal inputChanges) { - } - - @Override - public void clearInputChanges() { - } - - @Override - public void execute(Task task) { - ClassLoader original = Thread.currentThread().getContextClassLoader(); - Thread.currentThread().setContextClassLoader(action.getClass().getClassLoader()); - try { - action.execute(task); - } finally { - Thread.currentThread().setContextClassLoader(original); - } - } - - @Override - public ImplementationSnapshot getActionImplementation(ClassLoaderHierarchyHasher hasher) { - return ImplementationSnapshot.of(getActionClassName(action), hasher.getClassLoaderHash(action.getClass().getClassLoader())); - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof TaskActionWrapper)) { - return false; - } - - TaskActionWrapper that = (TaskActionWrapper) o; - return action.equals(that.action); - } - - @Override - public int hashCode() { - return action.hashCode(); - } - - @Override - public String getDisplayName() { - if (action instanceof Describable) { - return ((Describable) action).getDisplayName(); - } - return "Execute " + maybeActionName; - } - } - - private static String getActionClassName(Object action) { - if (action instanceof ScriptOrigin) { - ScriptOrigin origin = (ScriptOrigin) action; - return origin.getOriginalClassName() + "_" + origin.getContentHash(); - } else { - return action.getClass().getName(); - } - } - - @Override - public void setMustRunAfter(final Iterable mustRunAfterTasks) { - taskMutator.mutate("Task.setMustRunAfter(Iterable)", new Runnable() { - @Override - public void run() { - mustRunAfter.setValues(mustRunAfterTasks); - } - }); - } - - @Override - public Task mustRunAfter(final Object... paths) { - taskMutator.mutate("Task.mustRunAfter(Object...)", new Runnable() { - @Override - public void run() { - mustRunAfter.add(paths); - } - }); - return this; - } - - @Override - public TaskDependency getMustRunAfter() { - return mustRunAfter; - } - - @Override - public void setFinalizedBy(final Iterable finalizedByTasks) { - taskMutator.mutate("Task.setFinalizedBy(Iterable)", new Runnable() { - @Override - public void run() { - finalizedBy.setValues(finalizedByTasks); - } - }); - } - - @Override - public Task finalizedBy(final Object... paths) { - taskMutator.mutate("Task.finalizedBy(Object...)", new Runnable() { - @Override - public void run() { - finalizedBy.add(paths); - } - }); - return this; - } - - @Override - public TaskDependency getFinalizedBy() { - return finalizedBy; - } - - @Override - public TaskDependency shouldRunAfter(final Object... paths) { - taskMutator.mutate("Task.shouldRunAfter(Object...)", new Runnable() { - @Override - public void run() { - shouldRunAfter.add(paths); - } - }); - return shouldRunAfter; - } - - @Override - public void setShouldRunAfter(final Iterable shouldRunAfterTasks) { - taskMutator.mutate("Task.setShouldRunAfter(Iterable)", new Runnable() { - @Override - public void run() { - shouldRunAfter.setValues(shouldRunAfterTasks); - } - }); - } - - @Override - public TaskDependency getShouldRunAfter() { - return shouldRunAfter; - } - - private class ObservableActionWrapperList extends ObservableList { - public ObservableActionWrapperList(List delegate) { - super(delegate); - } - - @Override - public boolean add(Object action) { - if (action == null) { - throw new InvalidUserDataException("Action must not be null!"); - } - return super.add(wrap(Cast.uncheckedNonnullCast(action))); - } - - @Override - public void add(int index, Object action) { - if (action == null) { - throw new InvalidUserDataException("Action must not be null!"); - } - super.add(index, wrap(Cast.uncheckedNonnullCast(action))); - } - - @Override - public boolean addAll(Collection actions) { - if (actions == null) { - throw new InvalidUserDataException("Actions must not be null!"); - } - return super.addAll(transformToContextAwareTaskActions(Cast.uncheckedNonnullCast(actions))); - } - - @Override - public boolean addAll(int index, Collection actions) { - if (actions == null) { - throw new InvalidUserDataException("Actions must not be null!"); - } - return super.addAll(index, transformToContextAwareTaskActions(Cast.uncheckedNonnullCast(actions))); - } - - @Override - public Object set(int index, Object action) { - if (action == null) { - throw new InvalidUserDataException("Action must not be null!"); - } - return super.set(index, wrap(Cast.uncheckedNonnullCast(action))); - } - - @Override - public boolean removeAll(Collection actions) { - return super.removeAll(transformToContextAwareTaskActions(Cast.uncheckedNonnullCast(actions))); - } - - @Override - public boolean remove(Object action) { - return super.remove(wrap(Cast.uncheckedNonnullCast(action))); - } - - private Collection transformToContextAwareTaskActions(Collection c) { - return Collections2.transform(c, input -> wrap(Cast.uncheckedCast(input))); - } - } - - @Override - public void prependParallelSafeAction(final Action action) { - if (action == null) { - throw new InvalidUserDataException("Action must not be null!"); - } - getTaskActions().add(0, wrap(action)); - } - - @Override - public void appendParallelSafeAction(final Action action) { - if (action == null) { - throw new InvalidUserDataException("Action must not be null!"); - } - getTaskActions().add(wrap(action)); - } - - @Override - public boolean isHasCustomActions() { - return hasCustomActions; - } - - @Override - public Property getTimeout() { - return timeout; - } - - @Override - public void usesService(Provider> service) { - taskMutator.mutate("Task.usesService(Provider)", () -> { - if (requiredServices == null) { - requiredServices = new HashSet<>(); - } - requiredServices.add(service); - }); - } - - public Set>> getRequiredServices() { - if (requiredServices == null) { - return Collections.emptySet(); - } - return requiredServices; - } - - @Override - public List getSharedResources() { - if (requiredServices == null) { - return Collections.emptyList(); - } - com.google.common.collect.ImmutableList.Builder locks = ImmutableList.builder(); - BuildServiceRegistryInternal serviceRegistry = getServices().get(BuildServiceRegistryInternal.class); - for (Provider> service : requiredServices) { - SharedResource resource = serviceRegistry.forService(service); - if (resource.getMaxUsages() > 0) { - locks.add(resource.getResourceLock(1)); - } - } - return locks.build(); - } - - private void notifyProjectAccess() { - if (state.getExecuting()) { - getTaskExecutionAccessBroadcaster().onProjectAccess("Task.project", this); - } - } - - private void notifyTaskDependenciesAccess(String invocationDescription) { - if (state.getExecuting()) { - getTaskExecutionAccessBroadcaster().onTaskDependenciesAccess(invocationDescription, this); - } - } - - private TaskExecutionAccessListener getTaskExecutionAccessBroadcaster() { - return services.get(ListenerManager.class).getBroadcaster(TaskExecutionAccessListener.class); - } } diff --git a/src/main/java/io/github/fvarrui/javapackager/PackagerFactory.java b/src/main/java/io/github/fvarrui/javapackager/PackagerFactory.java index 456a7208..c8e7b8ac 100644 --- a/src/main/java/io/github/fvarrui/javapackager/PackagerFactory.java +++ b/src/main/java/io/github/fvarrui/javapackager/PackagerFactory.java @@ -10,7 +10,7 @@ public interface PackagerFactory { default Packager createPackager(PackageTask task){ Packager packager = null; - switch (Platform.getCurrentPlatform()) { + switch (task.platform) { case mac: packager = new MacPackager(task); break; case linux: diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePlugin.java b/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePlugin.java index b1fcfba0..c10c5c70 100644 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePlugin.java +++ b/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePlugin.java @@ -6,10 +6,7 @@ import io.github.fvarrui.javapackager.packagers.Context; import org.gradle.api.Plugin; import org.gradle.api.Project; -import org.gradle.api.Task; -import java.lang.reflect.Constructor; -import java.lang.reflect.Parameter; import java.util.UUID; /** @@ -29,8 +26,10 @@ public void apply(Project project) { project.getPluginManager().apply("java"); project.getPluginManager().apply("edu.sc.seis.launch4j"); + PackageTask extension = project.getExtensions().create(SETTINGS_EXT_NAME, PackageTask.class); GradlePackageTask task = (GradlePackageTask) project.getTasks().create(PACKAGE_TASK_NAME, GradlePackageTask.class).dependsOn("build"); - project.getExtensions().add(SETTINGS_EXT_NAME, task); // Use task instance as extension + task.updateExtension(extension); + task.getExtensions().add(SETTINGS_EXT_NAME, extension); Context.getGradleContext().setLibraryTask(project.getTasks().create("launch4j_" + UUID.randomUUID(), Launch4jLibraryTask.class)); } diff --git a/test/hello-world-gradle/build.gradle b/test/hello-world-gradle/build.gradle index bf78618d..122b6cdf 100644 --- a/test/hello-world-gradle/build.gradle +++ b/test/hello-world-gradle/build.gradle @@ -20,7 +20,7 @@ dependencies { implementation 'commons-io:commons-io:2.6' } -import io.github.fvarrui.javapackager.PackageTask; +import io.github.fvarrui.javapackager.GradlePackageTask; import io.github.fvarrui.javapackager.model.*; group = 'io.github.fvarrui' @@ -38,61 +38,69 @@ javapackager { administratorRequired = false } -task packageForWindows(type: PackageTask, dependsOn: build) { - description = 'Packages the application as a native Windows executable and bundles it in a zipball' - platform = 'windows' - winConfig { - exeCreationTool = 'winrun4j' - vmArgs = ["-Dprism.maxvram=512m -XX:+UseG1GC"] - generateSetup = false - generateMsi = false - registry = new Registry([ - entries: [ - new RegistryEntry([ - key: "HKCU:MyGradleApp", - valueName: "greeting", - valueType: ValueType.REG_SZ, - valueData: "hello" - ]) - ] - ]) - icoFile = file("windows/HelloWorldGradle.ico") - setupMode = SetupMode.askTheUser - removeOldLibs = true - disableDirPage = false - disableFinishedPage = false - disableWelcomePage = false - createDesktopIconTask = false - } +task packageForWindows(type: GradlePackageTask, dependsOn: build) { + javapackager{ + description = 'Packages the application as a native Windows executable and bundles it in a zipball' + platform = 'windows' + winConfig { + exeCreationTool = 'winrun4j' + vmArgs = ["-Dprism.maxvram=512m -XX:+UseG1GC"] + generateSetup = false + generateMsi = false + registry = new Registry([ + entries: [ + new RegistryEntry([ + key: "HKCU:MyGradleApp", + valueName: "greeting", + valueType: ValueType.REG_SZ, + valueData: "hello" + ]) + ] + ]) + icoFile = file("windows/HelloWorldGradle.ico") + setupMode = SetupMode.askTheUser + removeOldLibs = true + disableDirPage = false + disableFinishedPage = false + disableWelcomePage = false + createDesktopIconTask = false + } + } } -task packageForLinux(type: PackageTask, dependsOn: build) { - description = 'Packages the application as a native GNU/Linux executable and bundles it in a tarball' - platform = 'linux' - bundleJre = true - createTarball = true - scripts { - bootstrap = file('assets/bootstrap.sh') +task packageForLinux(type: GradlePackageTask, dependsOn: build) { + javapackager{ + description = 'Packages the application as a native GNU/Linux executable and bundles it in a tarball' + platform = 'linux' + bundleJre = true + createTarball = true + scripts { + bootstrap = file('assets/bootstrap.sh') + } } } -task packageForMac(type: PackageTask, dependsOn: build) { - description = 'Packages the application as a native Mac OS app and bundles it in a tarball' - platform = 'mac' - createTarball = true - scripts { - bootstrap = file('assets/bootstrap.sh') - } - macConfig { - infoPlist.additionalEntries = ''' +task packageForMac(type: GradlePackageTask, dependsOn: build) { + javapackager{ + description = 'Packages the application as a native Mac OS app and bundles it in a tarball' + platform = 'mac' + createTarball = true + scripts { + bootstrap = file('assets/bootstrap.sh') + } + macConfig { + infoPlist.additionalEntries = ''' LSUIElement ''' + } } } task packageForAllPlatforms(dependsOn: [ packageForWindows, packageForMac, packageForLinux ]) { - description = 'Packages the application for all platforms' - group = 'JavaPackager' + javapackager{ + description = 'Packages the application for all platforms' + group = 'JavaPackager' + } } From cc96eebb5369440e229b883ff8e65b94617d039f Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Fri, 19 Aug 2022 18:07:03 +0200 Subject: [PATCH 49/74] fix maven --- .../fvarrui/javapackager/PackageTask.java | 22 +++++++++---------- .../github/fvarrui/javapackager/RealTest.java | 1 + 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/main/java/io/github/fvarrui/javapackager/PackageTask.java b/src/main/java/io/github/fvarrui/javapackager/PackageTask.java index 6df0f742..f996fcf8 100644 --- a/src/main/java/io/github/fvarrui/javapackager/PackageTask.java +++ b/src/main/java/io/github/fvarrui/javapackager/PackageTask.java @@ -69,13 +69,13 @@ public PackageTask() { this.additionalModulePaths = new ArrayList<>(); this.fileAssociations = null; this.packagingJdk = null; - scripts(new Scripts()); + scripts = new Scripts(); } /** * Output directory. */ - @Parameter(property = "outputDirectory", required = false) + @Parameter(property = "outputDirectory", defaultValue = "${project.build.directory}") @OutputDirectory @Optional protected File outputDirectory; @@ -115,7 +115,7 @@ public PackageTask() { /** * Full path to your app main class. */ - @Parameter(property = "mainClass", required = true) + @Parameter(property = "mainClass", required = true, defaultValue = "${exec.mainClass}") @Input @Optional protected String mainClass; @@ -123,7 +123,7 @@ public PackageTask() { /** * App name. */ - @Parameter(property = "appName") + @Parameter(property = "appName", defaultValue = "${project.name}") @Input @Optional protected String appName; @@ -131,7 +131,7 @@ public PackageTask() { /** * App name to show. */ - @Parameter(property = "appDisplayName") + @Parameter(property = "appDisplayName", defaultValue = "${project.name}") @Input @Optional protected String appDisplayName; @@ -139,7 +139,7 @@ public PackageTask() { /** * Project version. */ - @Parameter(property = "version") + @Parameter(property = "version", defaultValue = "${project.version}") @Input @Optional protected String version; @@ -147,7 +147,7 @@ public PackageTask() { /** * Project description. */ - @Parameter(property = "description") + @Parameter(property = "description", defaultValue = "${project.description}") @Input @Optional protected String description; @@ -155,7 +155,7 @@ public PackageTask() { /** * App website URL. */ - @Parameter(property = "url") + @Parameter(property = "url", defaultValue = "${project.url}") @Input @Optional protected String url; @@ -171,7 +171,7 @@ public PackageTask() { /** * Organization name. */ - @Parameter(property = "organizationName", required = false) + @Parameter(property = "organizationName", defaultValue = "${project.organization.name}") @Input @Optional protected String organizationName; @@ -179,7 +179,7 @@ public PackageTask() { /** * Organization website URL. */ - @Parameter(property = "organizationUrl", required = false) + @Parameter(property = "organizationUrl", defaultValue = "${project.organization.url}") @Input @Optional protected String organizationUrl; @@ -378,7 +378,7 @@ public PackageTask() { /** * Assets directory */ - @Parameter(property = "assetsDir", required = false) + @Parameter(property = "assetsDir", defaultValue = "${project.basedir}/assets") @InputDirectory @Optional protected File assetsDir; diff --git a/src/test/java/io/github/fvarrui/javapackager/RealTest.java b/src/test/java/io/github/fvarrui/javapackager/RealTest.java index a1d5ba40..2c4b4076 100644 --- a/src/test/java/io/github/fvarrui/javapackager/RealTest.java +++ b/src/test/java/io/github/fvarrui/javapackager/RealTest.java @@ -22,6 +22,7 @@ void helloWorldMaven() throws Exception { request.setGoals(Arrays.asList("clean", "package")); request.addArg("-Dmaven.javadoc.skip=true"); request.addArg("-Dmaven.test.skip=true"); + request.addArg("-e"); Invoker invoker = new DefaultInvoker(); InvocationResult result = invoker.execute(request); if(result.getExitCode() != 0 || result.getExecutionException() != null) From 93956a46bb634f96513fb809cfd10999377126b9 Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Fri, 19 Aug 2022 18:15:49 +0200 Subject: [PATCH 50/74] update docs --- README.md | 36 +++++---- docs/gradle/plugin-configuration-samples.md | 86 +++++++++++++-------- 2 files changed, 72 insertions(+), 50 deletions(-) diff --git a/README.md b/README.md index 6c9b29a0..6a55338e 100644 --- a/README.md +++ b/README.md @@ -88,25 +88,27 @@ apply plugin: 'io.github.fvarrui.javapackager.plugin' Create your packaging task: ```groovy -task packageMyApp(type: io.github.fvarrui.javapackager.gradle.PackageTask, dependsOn: build) { - // mandatory - mainClass = 'path.to.your.mainClass' - // optional - bundleJre = true|false - generateInstaller = true|false - administratorRequired = true|false - platform = auto|linux|mac|windows - additionalResources = [ file('file path'), file('folder path'), ... ] - linuxConfig { +task packageMyApp(type: io.github.fvarrui.javapackager.GradlePackageTask, dependsOn: build) { + javapackager{ + // mandatory + mainClass = 'path.to.your.mainClass' + // optional + bundleJre = true|false + generateInstaller = true|false + administratorRequired = true|false + platform = auto|linux|mac|windows + additionalResources = [ file('file path'), file('folder path'), ... ] + linuxConfig { + ... + } + macConfig { + ... + } + winConfig { + ... + } ... } - macConfig { - ... - } - winConfig { - ... - } - ... } ``` diff --git a/docs/gradle/plugin-configuration-samples.md b/docs/gradle/plugin-configuration-samples.md index 2b2be886..795cc1bd 100644 --- a/docs/gradle/plugin-configuration-samples.md +++ b/docs/gradle/plugin-configuration-samples.md @@ -9,8 +9,10 @@ Add next task to your `build.gradle` file: ```groovy -task packageMyApp(type: io.github.fvarrui.javapackager.gradle.PackageTask, dependsOn: build) { - mainClass = 'fvarrui.sample.Main' +task packageMyApp(type: io.github.fvarrui.javapackager.GradlePackageTask, dependsOn: build) { + javapackager{ + mainClass = 'fvarrui.sample.Main' + } } ``` @@ -30,9 +32,11 @@ And run `gradle package`. ## Bundle with a customized JRE ```groovy -task packageMyApp(type: io.github.fvarrui.javapackager.gradle.PackageTask, dependsOn: build) { - mainClass = 'fvarrui.sample.Main' - bundleJre = true +task packageMyApp(type: io.github.fvarrui.javapackager.GradlePackageTask, dependsOn: build) { + javapackager{ + mainClass = 'fvarrui.sample.Main' + bundleJre = true + } } ``` @@ -41,31 +45,37 @@ task packageMyApp(type: io.github.fvarrui.javapackager.gradle.PackageTask, depen ## Bundle with a full JRE ```groovy -task packageMyApp(type: io.github.fvarrui.javapackager.gradle.PackageTask, dependsOn: build) { - mainClass = 'fvarrui.sample.Main' - bundleJre = true - customizedJre = false +task packageMyApp(type: io.github.fvarrui.javapackager.GradlePackageTask, dependsOn: build) { + javapackager{ + mainClass = 'fvarrui.sample.Main' + bundleJre = true + customizedJre = false + } } ``` ## Bundle with an existing JRE ```groovy -task packageMyApp(type: io.github.fvarrui.javapackager.gradle.PackageTask, dependsOn: build) { - mainClass = 'fvarrui.sample.Main' - bundleJre = true - jrePath = file('C:\Program Files\Java\jre1.8.0_231') +task packageMyApp(type: io.github.fvarrui.javapackager.GradlePackageTask, dependsOn: build) { + javapackager{ + mainClass = 'fvarrui.sample.Main' + bundleJre = true + jrePath = file('C:\Program Files\Java\jre1.8.0_231') + } } ``` ## Bundle your own fat JAR ```groovy -task packageMyApp(type: io.github.fvarrui.javapackager.gradle.PackageTask, dependsOn: build) { - mainClass = 'fvarrui.sample.Main' - bundleJre = true - runnableJar = file('path/to/your/own/fat.jar') - copyDependencies = false +task packageMyApp(type: io.github.fvarrui.javapackager.GradlePackageTask, dependsOn: build) { + javapackager{ + mainClass = 'fvarrui.sample.Main' + bundleJre = true + runnableJar = file('path/to/your/own/fat.jar') + copyDependencies = false + } } ``` @@ -76,13 +86,17 @@ javapackager { // common configuration mainClass = 'fvarrui.sample.Main' } -task packageMyAppWithJRE(type: io.github.fvarrui.javapackager.gradle.PackageTask, dependsOn: build) { - name = 'Sample' - bundleJre = true +task packageMyAppWithJRE(type: io.github.fvarrui.javapackager.GradlePackageTask, dependsOn: build) { + javapackager{ + name = 'Sample' + bundleJre = true + } } -task packageMyAppWithoutJRE(type: io.github.fvarrui.javapackager.gradle.PackageTask, dependsOn: build) { - name = 'Sample-nojre' - bundleJre = false +task packageMyAppWithoutJRE(type: io.github.fvarrui.javapackager.GradlePackageTask, dependsOn: build) { + javapackager{ + name = 'Sample-nojre' + bundleJre = false + } } task packageMyApp(dependsOn: [ 'packageMyAppWithJRE', 'packageMyAppWithoutJRE' ]) ``` @@ -100,17 +114,23 @@ javapackager { bundleJre = true generateInstaller = false } -task packageMyAppForLinux(type: io.github.fvarrui.javapackager.gradle.PackageTask, dependsOn: build) { - platform = linux - createTarball = true +task packageMyAppForLinux(type: io.github.fvarrui.javapackager.GradlePackageTask, dependsOn: build) { + javapackager{ + platform = linux + createTarball = true + } } -task packageMyAppForMac(type: io.github.fvarrui.javapackager.gradle.PackageTask, dependsOn: build) { - platform = mac - createTarball = true +task packageMyAppForMac(type: io.github.fvarrui.javapackager.GradlePackageTask, dependsOn: build) { + javapackager{ + platform = mac + createTarball = true + } } -task packageMyAppForWindows(type: io.github.fvarrui.javapackager.gradle.PackageTask, dependsOn: build) { - platform = windows - createZipball = true +task packageMyAppForWindows(type: io.github.fvarrui.javapackager.GradlePackageTask, dependsOn: build) { + javapackager{ + platform = windows + createZipball = true + } } task packageMyApp(dependsOn: [ 'packageMyAppForLinux', 'packageMyAppForMac', 'packageMyAppForWindows' ]) ``` From 740caf43704a76c265c567bc7d7160dc15ac6376 Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Fri, 19 Aug 2022 18:37:34 +0200 Subject: [PATCH 51/74] added comments and added GLOBAL_EXTENSION --- .../javapackager/GradlePackageTask.java | 22 +++++++++---------- .../javapackager/gradle/PackagePlugin.java | 8 +++---- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/main/java/io/github/fvarrui/javapackager/GradlePackageTask.java b/src/main/java/io/github/fvarrui/javapackager/GradlePackageTask.java index 1c18f0ec..46e9d8d7 100644 --- a/src/main/java/io/github/fvarrui/javapackager/GradlePackageTask.java +++ b/src/main/java/io/github/fvarrui/javapackager/GradlePackageTask.java @@ -15,7 +15,15 @@ import java.util.*; public class GradlePackageTask extends DefaultTask implements PackagerFactory { - public PackageTask extension = new PackageTask(); + /** + * This is the global javapackager instance.
+ * Sadly we need to do it like this because + * we cannot extend {@link PackageTask} because we already + * extend another class. This means that this task + * has no properties, instead we use this extensions properties. + * @see PackagePlugin + */ + public PackageTask extension; private final Project gradleProject = Context.getGradleContext().getProject(); private List outputFiles; @@ -23,7 +31,7 @@ public GradlePackageTask() throws IllegalAccessException { setGroup(PackagePlugin.GROUP_NAME); setDescription("Packages the application as a native Windows, Mac OS X or GNU/Linux executable and creates an installer"); getOutputs().upToDateWhen(o -> false); - updateExtension(extension); + updateExtension(PackagePlugin.GLOBAL_EXTENSION); } public void updateExtension(PackageTask extension){ @@ -40,16 +48,6 @@ public void updateExtension(PackageTask extension){ this.extension.assetsDir = new File(gradleProject.getProjectDir(), "assets"); } - private List getFieldsWithAnnotation(Field[] fields, Class annotationClass) { - List list = new ArrayList<>(); - for (Field field : fields) { - if(field.isAnnotationPresent(annotationClass)){ - list.add(field); - } - } - return list; - } - @OutputFiles public List getOutputFiles() { return outputFiles != null ? outputFiles : new ArrayList<>(); diff --git a/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePlugin.java b/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePlugin.java index c10c5c70..38042d65 100644 --- a/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePlugin.java +++ b/src/main/java/io/github/fvarrui/javapackager/gradle/PackagePlugin.java @@ -16,7 +16,8 @@ public class PackagePlugin implements Plugin { public static final String GROUP_NAME = "JavaPackager"; public static final String SETTINGS_EXT_NAME = "javapackager"; - public static final String PACKAGE_TASK_NAME = "package"; + public static final String PACKAGE_TASK_NAME = "package"; + public static PackageTask GLOBAL_EXTENSION; @Override public void apply(Project project) { @@ -26,10 +27,9 @@ public void apply(Project project) { project.getPluginManager().apply("java"); project.getPluginManager().apply("edu.sc.seis.launch4j"); - PackageTask extension = project.getExtensions().create(SETTINGS_EXT_NAME, PackageTask.class); + GLOBAL_EXTENSION = project.getExtensions().create(SETTINGS_EXT_NAME, PackageTask.class); GradlePackageTask task = (GradlePackageTask) project.getTasks().create(PACKAGE_TASK_NAME, GradlePackageTask.class).dependsOn("build"); - task.updateExtension(extension); - task.getExtensions().add(SETTINGS_EXT_NAME, extension); + task.getExtensions().add(SETTINGS_EXT_NAME, GLOBAL_EXTENSION); Context.getGradleContext().setLibraryTask(project.getTasks().create("launch4j_" + UUID.randomUUID(), Launch4jLibraryTask.class)); } From 798854f7714bdec1ea8898c4daa199a09e7104de Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Fri, 19 Aug 2022 19:03:55 +0200 Subject: [PATCH 52/74] comment --- .../java/io/github/fvarrui/javapackager/GradlePackageTask.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/github/fvarrui/javapackager/GradlePackageTask.java b/src/main/java/io/github/fvarrui/javapackager/GradlePackageTask.java index 46e9d8d7..b80f6622 100644 --- a/src/main/java/io/github/fvarrui/javapackager/GradlePackageTask.java +++ b/src/main/java/io/github/fvarrui/javapackager/GradlePackageTask.java @@ -16,7 +16,7 @@ public class GradlePackageTask extends DefaultTask implements PackagerFactory { /** - * This is the global javapackager instance.
+ * This is the global javapackager extension instance.
* Sadly we need to do it like this because * we cannot extend {@link PackageTask} because we already * extend another class. This means that this task From 811646b6d6b33d71e16039051a50307f277a6345 Mon Sep 17 00:00:00 2001 From: Osiris Team Date: Fri, 19 Aug 2022 19:13:05 +0200 Subject: [PATCH 53/74] code cleanup --- .../javapackager/GradlePackageTask.java | 19 +- .../javapackager/MavenPackageTask.java | 8 +- .../fvarrui/javapackager/PackageTask.java | 245 +++++++++++------- .../fvarrui/javapackager/PackagerFactory.java | 12 +- 4 files changed, 170 insertions(+), 114 deletions(-) diff --git a/src/main/java/io/github/fvarrui/javapackager/GradlePackageTask.java b/src/main/java/io/github/fvarrui/javapackager/GradlePackageTask.java index b80f6622..de25167a 100644 --- a/src/main/java/io/github/fvarrui/javapackager/GradlePackageTask.java +++ b/src/main/java/io/github/fvarrui/javapackager/GradlePackageTask.java @@ -6,35 +6,37 @@ import io.github.fvarrui.javapackager.model.*; import io.github.fvarrui.javapackager.packagers.Context; import io.github.fvarrui.javapackager.packagers.Packager; -import org.gradle.api.*; -import org.gradle.api.tasks.*; +import org.gradle.api.DefaultTask; +import org.gradle.api.Project; +import org.gradle.api.tasks.OutputFiles; +import org.gradle.api.tasks.TaskAction; import java.io.File; -import java.lang.annotation.Annotation; -import java.lang.reflect.Field; -import java.util.*; +import java.util.ArrayList; +import java.util.List; public class GradlePackageTask extends DefaultTask implements PackagerFactory { + private final Project gradleProject = Context.getGradleContext().getProject(); /** * This is the global javapackager extension instance.
* Sadly we need to do it like this because * we cannot extend {@link PackageTask} because we already * extend another class. This means that this task * has no properties, instead we use this extensions properties. + * * @see PackagePlugin */ public PackageTask extension; - private final Project gradleProject = Context.getGradleContext().getProject(); private List outputFiles; - public GradlePackageTask() throws IllegalAccessException { + public GradlePackageTask() { setGroup(PackagePlugin.GROUP_NAME); setDescription("Packages the application as a native Windows, Mac OS X or GNU/Linux executable and creates an installer"); getOutputs().upToDateWhen(o -> false); updateExtension(PackagePlugin.GLOBAL_EXTENSION); } - public void updateExtension(PackageTask extension){ + public void updateExtension(PackageTask extension) { this.extension = extension; // Defaults specific to gradle this.extension.outputDirectory = gradleProject.getBuildDir(); @@ -55,6 +57,7 @@ public List getOutputFiles() { /** * Packaging task action + * * @throws Exception Throwed if something went wrong */ @TaskAction diff --git a/src/main/java/io/github/fvarrui/javapackager/MavenPackageTask.java b/src/main/java/io/github/fvarrui/javapackager/MavenPackageTask.java index 3f865925..8fcae3c6 100644 --- a/src/main/java/io/github/fvarrui/javapackager/MavenPackageTask.java +++ b/src/main/java/io/github/fvarrui/javapackager/MavenPackageTask.java @@ -48,10 +48,6 @@ public void execute() throws MojoExecutionException, MojoFailureException { } } - public void setLog(Log log) { - this.log = log; - } - public Log getLog() { if (this.log == null) { this.log = new SystemStreamLog(); @@ -60,6 +56,10 @@ public Log getLog() { return this.log; } + public void setLog(Log log) { + this.log = log; + } + public Map getPluginContext() { return this.pluginContext; } diff --git a/src/main/java/io/github/fvarrui/javapackager/PackageTask.java b/src/main/java/io/github/fvarrui/javapackager/PackageTask.java index f996fcf8..06b7dd4f 100644 --- a/src/main/java/io/github/fvarrui/javapackager/PackageTask.java +++ b/src/main/java/io/github/fvarrui/javapackager/PackageTask.java @@ -17,61 +17,6 @@ */ public class PackageTask { - public PackageTask() { - //this.outputDirectory = (isGradle ? gradleProject.getBuildDir() : new File("${project.build.directory}")); - this.platform = Platform.getCurrentPlatform(); - this.bundleJre = true; - this.copyDependencies = true; - this.createTarball = false; - this.createZipball = false; - //this.description = gradleProject.getDescription(); // TODO maven? - this.generateInstaller = true; - this.linuxConfig = new LinuxConfig(); - this.macConfig = new MacConfig(); - this.manifest = new Manifest(); - this.modules = new ArrayList<>(); - this.forceInstaller = false; - this.mainClass = "${exec.mainClass}"; //TODO gradle? - //this.appName = (isGradle ? gradleProject.getName() : "${project.name}"); - //this.appDisplayName = (isGradle ? gradleProject.getName() : "${project.name}"); - //this.version = (isGradle ? (String) gradleProject.getVersion() : "${project.version}"); - //this.description = (isGradle ? gradleProject.getDescription(): "${project.description}"); - this.url = "${project.url}"; //TODO gradle? - this.administratorRequired = false; - //this.organizationName = (isGradle ? null : "${project.organization.name}"); - //this.organizationUrl = (isGradle ? null : "${project.organization.url}"); - this.organizationEmail = ""; - this.bundleJre = false; - this.customizedJre = true; - this.jrePath = null; - this.jdkPath = null; - this.jdkVersion = "17"; - this.jdkVendor = "adoptium"; - this.additionalResources = new ArrayList<>(); - this.modules = new ArrayList<>(); - this.additionalModules = new ArrayList<>(); - this.envPath = null; - this.vmArgs = new ArrayList<>(); - this.runnableJar = null; - this.copyDependencies = true; - this.jreDirectoryName = "jre"; - this.winConfig = new WindowsConfig(); - this.linuxConfig = new LinuxConfig(); - this.macConfig = new MacConfig(); - this.createTarball = false; - this.createZipball = false; - this.extra = new HashMap<>(); - this.useResourcesAsWorkingDir = true; - //this.assetsDir = (isGradle ? new File(gradleProject.getProjectDir(), "assets") : new File("${project.basedir}/assets")); - this.classpath = null; - this.jreMinVersion = null; - this.manifest = new Manifest(); - this.additionalModulePaths = new ArrayList<>(); - this.fileAssociations = null; - this.packagingJdk = null; - scripts = new Scripts(); - } - /** * Output directory. */ @@ -79,7 +24,6 @@ public PackageTask() { @OutputDirectory @Optional protected File outputDirectory; - /** * Path to project license file. */ @@ -87,7 +31,6 @@ public PackageTask() { @InputFile @Optional protected File licenseFile; - /** * Path to the app icon file (PNG, ICO or ICNS). */ @@ -95,7 +38,6 @@ public PackageTask() { @InputFile @Optional protected File iconFile; - /** * Generates an installer for the app. */ @@ -103,7 +45,6 @@ public PackageTask() { @Input @Optional protected Boolean generateInstaller; - /** * Forces installer generation. */ @@ -111,7 +52,6 @@ public PackageTask() { @Input @Optional protected Boolean forceInstaller; - /** * Full path to your app main class. */ @@ -119,7 +59,6 @@ public PackageTask() { @Input @Optional protected String mainClass; - /** * App name. */ @@ -127,7 +66,6 @@ public PackageTask() { @Input @Optional protected String appName; - /** * App name to show. */ @@ -135,7 +73,6 @@ public PackageTask() { @Input @Optional protected String appDisplayName; - /** * Project version. */ @@ -143,7 +80,6 @@ public PackageTask() { @Input @Optional protected String version; - /** * Project description. */ @@ -151,7 +87,6 @@ public PackageTask() { @Input @Optional protected String description; - /** * App website URL. */ @@ -159,7 +94,6 @@ public PackageTask() { @Input @Optional protected String url; - /** * App will run as administrator (with elevated privileges). */ @@ -167,7 +101,6 @@ public PackageTask() { @Input @Optional protected Boolean administratorRequired; - /** * Organization name. */ @@ -175,7 +108,6 @@ public PackageTask() { @Input @Optional protected String organizationName; - /** * Organization website URL. */ @@ -183,7 +115,6 @@ public PackageTask() { @Input @Optional protected String organizationUrl; - /** * Organization email. */ @@ -198,7 +129,6 @@ public PackageTask() { @Input @Optional protected Boolean bundleJre; - /** * Generates a customized JRE, including only identified or specified modules. Otherwise, all modules will be included. */ @@ -206,7 +136,6 @@ public PackageTask() { @Input @Optional protected Boolean customizedJre; - /** * Path to JRE folder. If specified, it will bundle this JRE with the app, and won't generate a customized JRE. For Java 8 version or least. */ @@ -214,7 +143,6 @@ public PackageTask() { @InputDirectory @Optional protected File jrePath; - /** * Path to JDK folder. If specified, it will use this JDK modules to generate a customized JRE. Allows generating JREs for different platforms. */ @@ -222,7 +150,6 @@ public PackageTask() { @InputDirectory @Optional protected File jdkPath; - /** * The JDK version. Supported versions differ from vendor to vendor, thus its recommended checking the vendors' website first before doing any changes. */ @@ -230,7 +157,6 @@ public PackageTask() { @Input @Optional protected String jdkVersion = "8"; - /** * The JDK vendor. */ @@ -238,7 +164,6 @@ public PackageTask() { @Input @Optional protected String jdkVendor = "adoptium"; - /** * Additional files and folders to include in the bundled app. */ @@ -246,7 +171,6 @@ public PackageTask() { @Input @Optional protected List additionalResources; - /** * Defines modules to customize the bundled JRE. Don't use jdeps to get module dependencies. */ @@ -254,7 +178,6 @@ public PackageTask() { @Input @Optional protected List modules; - /** * Additional modules to the ones identified by jdeps or the specified with modules property. */ @@ -262,7 +185,6 @@ public PackageTask() { @Input @Optional protected List additionalModules; - /** * Which platform to build, one of: *