11package io .github .fvarrui .javapackager .gradle ;
22
33import java .io .File ;
4+ import java .util .UUID ;
5+
6+ import com .netflix .gradle .plugins .deb .Deb ;
47
58import io .github .fvarrui .javapackager .packagers .ArtifactGenerator ;
9+ import io .github .fvarrui .javapackager .packagers .Context ;
610import io .github .fvarrui .javapackager .packagers .LinuxPackager ;
711import io .github .fvarrui .javapackager .packagers .Packager ;
812import io .github .fvarrui .javapackager .utils .Logger ;
13+ import io .github .fvarrui .javapackager .utils .VelocityUtils ;
914
1015/**
1116 * Creates a DEB package file including all app folder's content only for
@@ -28,7 +33,81 @@ public File apply(Packager packager) throws Exception {
2833
2934 Logger .warn ("Sorry! " + getArtifactName () + " generation is not yet available" );
3035
31- return null ;
36+ File assetsFolder = linuxPackager .getAssetsFolder ();
37+ String name = linuxPackager .getName ();
38+ String description = linuxPackager .getDescription ();
39+ File appFolder = linuxPackager .getAppFolder ();
40+ File outputDirectory = linuxPackager .getOutputDirectory ();
41+ String version = linuxPackager .getVersion ();
42+ boolean bundleJre = linuxPackager .getBundleJre ();
43+ String jreDirectoryName = linuxPackager .getJreDirectoryName ();
44+ File executable = linuxPackager .getExecutable ();
45+ String organizationName = linuxPackager .getOrganizationName ();
46+ String organizationEmail = linuxPackager .getOrganizationEmail ();
47+
48+ // generates desktop file from velocity template
49+ File desktopFile = new File (assetsFolder , name + ".desktop" );
50+ VelocityUtils .render ("linux/desktop.vtl" , desktopFile , linuxPackager );
51+ Logger .info ("Desktop file rendered in " + desktopFile .getAbsolutePath ());
52+
53+ // generates deb control file from velocity template
54+ File controlFile = new File (assetsFolder , "control" );
55+ VelocityUtils .render ("linux/control.vtl" , controlFile , linuxPackager );
56+ Logger .info ("Control file rendered in " + controlFile .getAbsolutePath ());
57+
58+ // generated deb file
59+ File debFile = new File (outputDirectory , name + "_" + version + ".deb" );
60+
61+ Deb debTask = createDebTask ();
62+ debTask .setProperty ("archiveFileName" , debFile .getName ());
63+ debTask .setProperty ("destinationDirectory" , outputDirectory );
64+ debTask .setPackageName (name );
65+ debTask .setPackageDescription (description );
66+ debTask .setPackager (organizationName );
67+ debTask .setMaintainer (organizationName + (organizationEmail != null ? " <" + organizationEmail + ">" : "" ));
68+ debTask .setPriority ("optional" );
69+ debTask .setArchStr ("amd64" );
70+ debTask .setDistribution ("development" );
71+
72+ /* installation destination */
73+ debTask .into ("/opt/" + name );
74+
75+ /* includes app folder files, except executable file and jre/bin/java */
76+ debTask .from (appFolder , c -> {
77+ c .into ("." );
78+ c .exclude (executable .getName ());
79+ if (bundleJre ) {
80+ c .exclude (jreDirectoryName + "/bin/java" );
81+ }
82+ });
83+
84+ /* executable */
85+ debTask .from (executable , c -> {
86+ c .into ("." );
87+ c .setFileMode (0755 );
88+ });
89+
90+ /* java binary file */
91+ if (bundleJre ) {
92+ debTask .from (new File (appFolder , jreDirectoryName + "/bin/java" ), c -> {
93+ c .into ("." );
94+ c .setFileMode (0755 );
95+ });
96+ }
97+
98+ /* desktop file */
99+ debTask .from (desktopFile , c -> {
100+ c .into ("/usr/share/applications" );
101+ });
102+
103+ /* symbolic link in /usr/local/bin to app binary */
104+ debTask .link ("/usr/local/bin/" + name , "/opt/" + name + "/" + name , 0777 );
105+
106+ return debFile ;
107+ }
108+
109+ private Deb createDebTask () {
110+ return Context .getGradleContext ().getProject ().getTasks ().create ("createDEb_" + UUID .randomUUID (), Deb .class );
32111 }
33112
34113}
0 commit comments