Skip to content

Commit 62214cc

Browse files
committed
U hybrid maven/gradle plugin
1 parent ecc078e commit 62214cc

29 files changed

+1006
-294
lines changed

build.gradle

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@ plugins {
1717
}
1818

1919
repositories {
20+
mavenLocal()
2021
mavenCentral()
21-
mavenLocal()
2222
}
2323

2424
gradlePlugin {
2525
plugins {
26-
packagePlugin {
26+
javaPackagerPlugin {
2727
id = 'io.github.fvarrui.javapackager.plugin'
2828
implementationClass = 'io.github.fvarrui.javapackager.gradle.PackagePlugin'
2929
}
@@ -36,7 +36,7 @@ pluginBundle {
3636
description = 'Hybrid Maven/Gradle plugin to package Java applications as native Windows, Mac OS X, or GNU/Linux executables and create installers for them'
3737
tags = ['java', 'packager', 'gradle-plugin', 'maven-plugin', 'native', 'installer', 'debian-packages', 'rpm-packages', 'dmg', 'maven', 'distribution', 'javapackager', 'linux-executables', 'deb', 'rpm', 'native-windows', 'java-applications', 'pkg', 'msi']
3838
plugins {
39-
packagePlugin {
39+
javaPackagerPlugin {
4040
displayName = 'JavaPackager plugin'
4141
}
4242
}
@@ -54,6 +54,7 @@ dependencies {
5454
implementation 'commons-io:commons-io:2.6'
5555
implementation 'org.apache.commons:commons-collections4:4.1'
5656
implementation 'org.apache.velocity:velocity-engine-core:2.0'
57+
implementation 'io.github.fvarrui:gradle-launch4j:2.4.7'
5758

5859
testImplementation 'junit:junit:4.12'
5960

@@ -79,9 +80,9 @@ compileJava.options.encoding = 'UTF-8'
7980

8081
publishing {
8182
publications {
82-
maven(MavenPublication) {
83+
mavenJava(MavenPublication) {
8384
from(components.java)
84-
}
85+
}
8586
}
8687
}
8788

@@ -138,8 +139,6 @@ task generatePluginDescriptor(type: JavaExec, dependsOn: compileJava) {
138139
}
139140

140141
project.jar.dependsOn(generatePluginDescriptor)
141-
142-
// apply plugin: 'io.codearte.nexus-staging'
143142

144143
if (project.hasProperty('release')) {
145144

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package io.github.fvarrui.javapackager.gradle;
2+
3+
import java.io.File;
4+
5+
import org.gradle.api.Project;
6+
import org.gradle.api.tasks.Copy;
7+
8+
import io.github.fvarrui.javapackager.packagers.Context;
9+
import io.github.fvarrui.javapackager.packagers.Packager;
10+
import io.github.fvarrui.javapackager.packagers.PackagerFunction;
11+
12+
/**
13+
* Copies all dependencies to app folder
14+
*
15+
*/
16+
public class CopyDependencies implements PackagerFunction {
17+
18+
public Copy copyLibsTask;
19+
20+
@Override
21+
public File apply(Packager packager) {
22+
23+
File libsFolder = new File(packager.getJarFileDestinationFolder(), "libs");
24+
Project project = Context.getGradleContext().getProject();
25+
26+
copyLibsTask = (Copy) project.getTasks().findByName("copyLibs");
27+
if (copyLibsTask == null) {
28+
copyLibsTask = project.getTasks().create("copyLibs", Copy.class);
29+
}
30+
copyLibsTask.from(project.getConfigurations().getByName("default"));
31+
copyLibsTask.into(project.file(libsFolder));
32+
copyLibsTask.getActions().forEach(action -> action.execute(copyLibsTask));
33+
34+
return libsFolder;
35+
}
36+
37+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package io.github.fvarrui.javapackager.gradle;
2+
3+
import java.io.File;
4+
import java.util.ArrayList;
5+
import java.util.Arrays;
6+
import java.util.List;
7+
import java.util.stream.Collectors;
8+
9+
import org.apache.commons.lang3.StringUtils;
10+
import org.gradle.api.Project;
11+
import org.gradle.api.tasks.bundling.Jar;
12+
13+
import io.github.fvarrui.javapackager.packagers.Context;
14+
import io.github.fvarrui.javapackager.packagers.Packager;
15+
import io.github.fvarrui.javapackager.packagers.PackagerFunction;
16+
17+
/**
18+
* Creates a runnable jar file from sources
19+
*/
20+
public class CreateRunnableJar implements PackagerFunction {
21+
22+
@Override
23+
public File apply(Packager packager) {
24+
25+
String classifier = "runnable";
26+
String name = packager.getName();
27+
String version = packager.getVersion();
28+
String mainClass = packager.getMainClass();
29+
File outputDirectory = packager.getOutputDirectory();
30+
Project project = Context.getGradleContext().getProject();
31+
File libsFolder = packager.getLibsFolder();
32+
33+
List<String> dependencies = new ArrayList<>();
34+
if (libsFolder != null && libsFolder.exists()) {
35+
dependencies = Arrays.asList(libsFolder.listFiles()).stream().map(f -> libsFolder.getName() + "/" + f.getName()).collect(Collectors.toList());
36+
}
37+
38+
Jar jarTask = (Jar) project.getTasks().findByName("jar");
39+
jarTask.setProperty("archiveBaseName", name);
40+
jarTask.setProperty("archiveVersion", version);
41+
jarTask.setProperty("archiveClassifier", classifier);
42+
jarTask.setProperty("destinationDirectory", outputDirectory);
43+
jarTask.getManifest().getAttributes().put("Main-Class", mainClass);
44+
jarTask.getManifest().getAttributes().put("Class-Path", StringUtils.join(dependencies, " "));
45+
jarTask.getActions().forEach(action -> action.execute(jarTask));
46+
47+
return jarTask.getArchiveFile().get().getAsFile();
48+
49+
}
50+
51+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package io.github.fvarrui.javapackager.gradle;
2+
3+
import java.io.File;
4+
5+
import org.gradle.api.Project;
6+
import org.gradle.api.tasks.bundling.Tar;
7+
8+
import io.github.fvarrui.javapackager.model.Platform;
9+
import io.github.fvarrui.javapackager.packagers.Context;
10+
import io.github.fvarrui.javapackager.packagers.Packager;
11+
import io.github.fvarrui.javapackager.packagers.PackagerFunction;
12+
13+
public class CreateTarball implements PackagerFunction {
14+
15+
private Tar tarTask;
16+
17+
@Override
18+
public File apply(Packager packager) {
19+
20+
String name = packager.getName();
21+
String version = packager.getVersion();
22+
Platform platform = packager.getPlatform();
23+
File outputDirectory = packager.getOutputDirectory();
24+
File appFolder = packager.getAppFolder();
25+
Project project = Context.getGradleContext().getProject();
26+
27+
File zipFile = new File(outputDirectory, name + "-" + version + "-" + platform + ".tar.gz");
28+
29+
tarTask = (Tar) project.getTasks().findByName("createTarball");
30+
if (tarTask == null) {
31+
tarTask = project.getTasks().create("createTarball", Tar.class);
32+
}
33+
tarTask.from(appFolder);
34+
tarTask.include("*", "*/*");
35+
tarTask.setProperty("archiveName", zipFile.getName());
36+
tarTask.setProperty("destinationDir", zipFile.getParentFile());
37+
tarTask.getActions().forEach(action -> action.execute(tarTask));
38+
39+
return zipFile;
40+
}
41+
42+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package io.github.fvarrui.javapackager.gradle;
2+
3+
import java.io.File;
4+
import java.util.List;
5+
6+
import org.gradle.api.Project;
7+
8+
import edu.sc.seis.launch4j.tasks.Launch4jLibraryTask;
9+
import io.github.fvarrui.javapackager.model.WindowsConfig;
10+
import io.github.fvarrui.javapackager.packagers.Context;
11+
import io.github.fvarrui.javapackager.packagers.Packager;
12+
import io.github.fvarrui.javapackager.packagers.PackagerFunction;
13+
import io.github.fvarrui.javapackager.packagers.WindowsPackager;
14+
import io.github.fvarrui.javapackager.utils.FileUtils;
15+
16+
/**
17+
* Copies all dependencies to app folder
18+
*
19+
*/
20+
public class CreateWindowsExe implements PackagerFunction {
21+
22+
@Override
23+
public File apply(Packager packager) {
24+
25+
WindowsPackager windowsPackager = (WindowsPackager) packager;
26+
27+
Project project = Context.getGradleContext().getProject();
28+
List<String> vmArgs = windowsPackager.getVmArgs();
29+
WindowsConfig winConfig = windowsPackager.getWinConfig();
30+
String jarPath = windowsPackager.getJarPath();
31+
File executable = windowsPackager.getExecutable();
32+
File iconFile = windowsPackager.getIconFile();
33+
File manifestFile = windowsPackager.getManifestFile();
34+
String mainClass = windowsPackager.getMainClass();
35+
boolean useResourcesAsWorkingDir = windowsPackager.isUseResourcesAsWorkingDir();
36+
boolean bundleJre = windowsPackager.getBundleJre();
37+
String jreDirectoryName = windowsPackager.getJreDirectoryName();
38+
39+
Launch4jLibraryTask l4jTask = project.getTasks().create("jplaunch4j", Launch4jLibraryTask.class);
40+
l4jTask.setHeaderType(winConfig.getHeaderType().toString());
41+
l4jTask.setJar(jarPath);
42+
l4jTask.setDontWrapJar(!winConfig.isWrapJar());
43+
l4jTask.setOutfile(executable.getName());
44+
l4jTask.setIcon(iconFile.getAbsolutePath());
45+
l4jTask.setManifest(manifestFile.getAbsolutePath());
46+
l4jTask.setMainClassName(mainClass);
47+
l4jTask.setChdir(useResourcesAsWorkingDir ? "." : "");
48+
l4jTask.setBundledJrePath(bundleJre ? jreDirectoryName : "%JAVA_HOME%");
49+
l4jTask.getJvmOptions().addAll(vmArgs);
50+
l4jTask.setVersion(winConfig.getProductVersion());
51+
l4jTask.setTextVersion(winConfig.getTxtProductVersion());
52+
l4jTask.setCopyright(winConfig.getCopyright());
53+
l4jTask.setCompanyName(winConfig.getCompanyName());
54+
l4jTask.setFileDescription(winConfig.getFileDescription());
55+
l4jTask.setProductName(winConfig.getProductName());
56+
l4jTask.setInternalName(winConfig.getInternalName());
57+
l4jTask.setTrademarks(winConfig.getTrademarks());
58+
l4jTask.setLanguage(winConfig.getLanguage());
59+
l4jTask.setLibraryDir("");
60+
l4jTask.getActions().forEach(action -> action.execute(l4jTask));
61+
62+
File generatedExe = new File(project.getBuildDir(), "launch4j/" + executable.getName());
63+
64+
try {
65+
FileUtils.copyFileToFile(generatedExe, executable);
66+
} catch (Exception e) {
67+
throw new RuntimeException(e);
68+
}
69+
70+
return executable;
71+
}
72+
73+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package io.github.fvarrui.javapackager.gradle;
2+
3+
import java.io.File;
4+
import java.util.UUID;
5+
6+
import org.gradle.api.tasks.bundling.Zip;
7+
8+
import io.github.fvarrui.javapackager.model.Platform;
9+
import io.github.fvarrui.javapackager.packagers.Context;
10+
import io.github.fvarrui.javapackager.packagers.Packager;
11+
import io.github.fvarrui.javapackager.packagers.PackagerFunction;
12+
13+
public class CreateZipball implements PackagerFunction {
14+
15+
@Override
16+
public File apply(Packager packager) {
17+
18+
String name = packager.getName();
19+
String version = packager.getVersion();
20+
Platform platform = packager.getPlatform();
21+
File outputDirectory = packager.getOutputDirectory();
22+
File appFolder = packager.getAppFolder();
23+
File executable = packager.getExecutable();
24+
25+
File zipFile = new File(outputDirectory, name + "-" + version + "-" + platform + ".zip");
26+
27+
Zip zipExcludingBinariesTask = createZipTask();
28+
zipExcludingBinariesTask.setProperty("archiveName", zipFile.getName());
29+
zipExcludingBinariesTask.setProperty("destinationDirectory", zipFile.getParentFile());
30+
zipExcludingBinariesTask.from(appFolder.getParentFile());
31+
zipExcludingBinariesTask.include(appFolder.getName() + "/**");
32+
zipExcludingBinariesTask.exclude(appFolder.getName() + "/" + executable.getName(), appFolder.getName() + "/jre/bin/*");
33+
zipExcludingBinariesTask.getActions().forEach(action -> action.execute(zipExcludingBinariesTask));
34+
35+
Zip zipIncludingBinariesTask = createZipTask();
36+
zipIncludingBinariesTask.setProperty("archiveName", zipFile.getName());
37+
zipIncludingBinariesTask.setProperty("destinationDirectory", zipFile.getParentFile());
38+
zipIncludingBinariesTask.from(appFolder.getParentFile());
39+
zipIncludingBinariesTask.exclude(appFolder.getName() + "/**");
40+
zipIncludingBinariesTask.include(appFolder.getName() + "/" + executable.getName(), appFolder.getName() + "/jre/bin/*");
41+
zipIncludingBinariesTask.setFileMode(0755);
42+
zipIncludingBinariesTask.getActions().forEach(action -> action.execute(zipIncludingBinariesTask));
43+
44+
return zipFile;
45+
}
46+
47+
private Zip createZipTask() {
48+
return Context.getGradleContext().getProject().getTasks().create("createZipball_" + UUID.randomUUID(), Zip.class);
49+
}
50+
51+
}
Lines changed: 54 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,65 @@
11
package io.github.fvarrui.javapackager.gradle;
22

3+
import java.io.File;
4+
5+
import org.gradle.api.Project;
36
import org.gradle.api.logging.Logger;
47

5-
public class GradleContext {
8+
import io.github.fvarrui.javapackager.packagers.Context;
9+
import io.github.fvarrui.javapackager.packagers.Packager;
10+
11+
public class GradleContext extends Context<Logger> {
12+
13+
private Project project;
14+
15+
public GradleContext(Project project) {
16+
super();
17+
this.project = project;
18+
}
19+
20+
public Logger getLogger() {
21+
return project.getLogger();
22+
}
23+
24+
public Project getProject() {
25+
return project;
26+
}
27+
28+
@Override
29+
public File getRootDir() {
30+
return project.getRootDir();
31+
}
32+
33+
@Override
34+
public File createRunnableJar(Packager packager) {
35+
return new CreateRunnableJar().apply(packager);
36+
}
37+
38+
@Override
39+
public File copyDependencies(Packager packager) {
40+
return new CopyDependencies().apply(packager);
41+
}
642

7-
private static Logger logger;
43+
@Override
44+
public File createTarball(Packager packager) {
45+
// TODO create tarball from gradle
46+
return null;
47+
}
848

9-
public static Logger getLogger() {
10-
return logger;
49+
@Override
50+
public File createZipball(Packager packager) {
51+
return new CreateZipball().apply(packager);
1152
}
1253

13-
public static void setLogger(Logger logger) {
14-
GradleContext.logger = logger;
54+
@Override
55+
public File resolveLicense(Packager packager) {
56+
// do nothing
57+
return null;
58+
}
59+
60+
@Override
61+
public File createWindowsExe(Packager packager) {
62+
return new CreateWindowsExe().apply(packager);
1563
}
1664

1765
}

0 commit comments

Comments
 (0)