Skip to content

Commit d66f684

Browse files
committed
A AppImage generator
1 parent 16d185a commit d66f684

File tree

4 files changed

+111
-6
lines changed

4 files changed

+111
-6
lines changed

src/main/java/io/github/fvarrui/javapackager/model/LinuxConfig.java

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@
1010
*/
1111
public class LinuxConfig implements Serializable {
1212
private static final long serialVersionUID = -1238166997019141904L;
13-
13+
1414
private boolean generateDeb = true;
1515
private boolean generateRpm = true;
16+
private boolean generateAppImage = true;
1617
private File pngFile;
1718
private boolean wrapJar = true;
1819

@@ -32,26 +33,34 @@ public void setGenerateRpm(boolean generateRpm) {
3233
this.generateRpm = generateRpm;
3334
}
3435

36+
public boolean isGenerateAppImage() {
37+
return generateAppImage;
38+
}
39+
40+
public void setGenerateAppImage(boolean generateAppImage) {
41+
this.generateAppImage = generateAppImage;
42+
}
43+
3544
public File getPngFile() {
36-
return pngFile;
45+
return pngFile;
3746
}
3847

3948
public void setPngFile(File pngFile) {
4049
this.pngFile = pngFile;
4150
}
42-
51+
4352
public boolean isWrapJar() {
4453
return wrapJar;
4554
}
46-
55+
4756
public void setWrapJar(boolean wrapJar) {
4857
this.wrapJar = wrapJar;
4958
}
5059

5160
@Override
5261
public String toString() {
53-
return "LinuxConfig [generateDeb=" + generateDeb + ", generateRpm=" + generateRpm + ", pngFile=" + pngFile
54-
+ ", wrapJar=" + wrapJar + "]";
62+
return "LinuxConfig [generateDeb=" + generateDeb + ", generateRpm=" + generateRpm + ", generateAppImage="
63+
+ generateAppImage + ", pngFile=" + pngFile + ", wrapJar=" + wrapJar + "]";
5564
}
5665

5766
/**

src/main/java/io/github/fvarrui/javapackager/packagers/Context.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public Context() {
2222
// building tool independent generators
2323
getInstallerGenerators(Platform.linux).add(new GenerateDeb());
2424
getInstallerGenerators(Platform.linux).add(new GenerateRpm());
25+
getInstallerGenerators(Platform.linux).add(new GenerateAppImage());
2526
getInstallerGenerators(Platform.mac).add(new GenerateDmg());
2627
getInstallerGenerators(Platform.mac).add(new GeneratePkg());
2728
getInstallerGenerators(Platform.windows).add(new GenerateSetup());
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package io.github.fvarrui.javapackager.packagers;
2+
3+
import java.io.File;
4+
import java.io.IOException;
5+
6+
import org.apache.commons.lang3.SystemUtils;
7+
8+
import io.github.fvarrui.javapackager.model.Platform;
9+
import io.github.fvarrui.javapackager.utils.CommandUtils;
10+
import io.github.fvarrui.javapackager.utils.FileUtils;
11+
import io.github.fvarrui.javapackager.utils.Logger;
12+
13+
public class GenerateAppImage extends ArtifactGenerator<LinuxPackager> {
14+
15+
private static final int IMAGETOOL_VERSION = 13;
16+
private static final String IMAGETOOL_URL = "https://github.com/AppImage/AppImageKit/releases/download/%d/appimagetool-%s.AppImage".formatted(IMAGETOOL_VERSION, SystemUtils.OS_ARCH);
17+
18+
public GenerateAppImage() {
19+
super("AppImage");
20+
}
21+
22+
@Override
23+
public boolean skip(LinuxPackager packager) {
24+
25+
if (!packager.getLinuxConfig().isGenerateAppImage()) {
26+
return true;
27+
}
28+
29+
if (!packager.getPlatform().isCurrentPlatform() && !packager.isForceInstaller()) {
30+
Logger.warn(getArtifactName() + " cannot be generated due to the target platform (" + packager.getPlatform() + ") is different from the execution platform (" + Platform.getCurrentPlatform() + ")!");
31+
return true;
32+
}
33+
34+
return false;
35+
36+
}
37+
38+
@Override
39+
protected File doApply(LinuxPackager packager) throws Exception {
40+
41+
File appFolder = packager.getAppFolder();
42+
File outputFolder = packager.getOutputDirectory();
43+
String name = packager.getName();
44+
File executable = packager.getExecutable();
45+
46+
// output AppImage file
47+
File appImage = new File(outputFolder, name + ".AppImage");
48+
49+
// AppRun symlink file
50+
File appRun = new File(appFolder, "AppRun");
51+
52+
// gets/downloads AppImage tool
53+
Logger.info("Getting appimagetool...");
54+
File appImageTool = getAppImageTool(packager);
55+
Logger.info("App image tool found! " + appImageTool);
56+
57+
// creates AppRun symlink to startup script
58+
Logger.info("Creating AppRun symlink to startup script...");
59+
FileUtils.createSymlink(appRun, new File(executable.getName()));
60+
61+
// runs appimagetool on appFolder
62+
Logger.info("Running appimagetool on " + appFolder);
63+
CommandUtils.execute(
64+
appImageTool,
65+
appFolder,
66+
appImage
67+
);
68+
69+
Logger.info("Setting execution permissions to " + appImage);
70+
appImage.setExecutable(true);
71+
72+
return appImage;
73+
}
74+
75+
private File getAppImageTool(LinuxPackager packager) throws IOException {
76+
File assetsFolder = packager.getAssetsFolder();
77+
File appImageTool = new File(assetsFolder, "appimagetool");
78+
if (!appImageTool.exists()) {
79+
FileUtils.downloadFromUrl(IMAGETOOL_URL, appImageTool);
80+
appImageTool.setExecutable(true);
81+
}
82+
return appImageTool;
83+
}
84+
85+
}

src/main/java/io/github/fvarrui/javapackager/utils/FileUtils.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,16 @@ public static void downloadFromUrl(URL url, File file) throws IOException {
298298
Logger.info("File downloaded from [" + url + "] to [" + file.getAbsolutePath() + "]");
299299
}
300300

301+
/**
302+
* Download a resource from an URL to a file
303+
* @param url URL to download
304+
* @param file File to copy the downloaded resource
305+
* @throws IOException Resource cannot be copied/downloaded
306+
*/
307+
public static void downloadFromUrl(String url, File file) throws IOException {
308+
downloadFromUrl(new URL(url), file);
309+
}
310+
301311
/**
302312
* Checks if a file exists or is not null
303313
* @param file File

0 commit comments

Comments
 (0)