Skip to content

Commit 8777557

Browse files
committed
U bootstrap script support for windows
1 parent bd8359e commit 8777557

File tree

5 files changed

+71
-6
lines changed

5 files changed

+71
-6
lines changed

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ dependencies {
5555
implementation 'org.vafer:jdeb:1.9'
5656
implementation 'net.jsign:jsign-core:3.1'
5757
implementation 'org.redline-rpm:redline:1.2.10'
58+
implementation 'com.github.vatbub:mslinks:1.0.6.2'
5859

5960
testImplementation 'junit:junit:4.12'
6061

src/main/java/io/github/fvarrui/javapackager/gradle/CreateWindowsExe.java

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@
77
import org.apache.commons.lang3.StringUtils;
88

99
import edu.sc.seis.launch4j.tasks.Launch4jLibraryTask;
10+
import io.github.fvarrui.javapackager.model.Platform;
1011
import io.github.fvarrui.javapackager.model.WindowsConfig;
1112
import io.github.fvarrui.javapackager.packagers.Context;
1213
import io.github.fvarrui.javapackager.packagers.WindowsArtifactGenerator;
1314
import io.github.fvarrui.javapackager.packagers.WindowsPackager;
1415
import io.github.fvarrui.javapackager.utils.FileUtils;
16+
import io.github.fvarrui.javapackager.utils.VelocityUtils;
1517

1618
/**
1719
* Creates Windows native executable on Gradle context
@@ -39,6 +41,8 @@ protected File doApply(WindowsPackager packager) throws Exception {
3941
String jreDirectoryName = packager.getJreDirectoryName();
4042
String jreMinVersion = packager.getJreMinVersion();
4143
File jarFile = packager.getJarFile();
44+
File appFolder = packager.getAppFolder();
45+
String name = packager.getName();
4246

4347
try {
4448
// creates a folder only for launch4j assets
@@ -60,7 +64,9 @@ protected File doApply(WindowsPackager packager) throws Exception {
6064
l4jTask.setMainClassName(mainClass);
6165
l4jTask.setClasspath(new HashSet<>(packager.getClasspaths()));
6266
l4jTask.setChdir(useResourcesAsWorkingDir ? "." : "");
63-
l4jTask.setBundledJrePath(bundleJre ? jreDirectoryName : "%JAVA_HOME%;%PATH%");
67+
if (bundleJre) {
68+
l4jTask.setBundledJrePath(jreDirectoryName);
69+
}
6470
if (!StringUtils.isBlank(jreMinVersion)) {
6571
l4jTask.setJreMinVersion(jreMinVersion);
6672
}
@@ -74,24 +80,39 @@ protected File doApply(WindowsPackager packager) throws Exception {
7480
l4jTask.setInternalName(winConfig.getInternalName());
7581
l4jTask.setTrademarks(winConfig.getTrademarks());
7682
l4jTask.setLanguage(winConfig.getLanguage());
77-
l4jTask.setLibraryDir("");
83+
//l4jTask.setLibraryDir("");
7884
l4jTask.getActions().forEach(action -> action.execute(l4jTask));
7985

8086
sign(genericExe, packager);
8187

8288
FileUtils.copyFileToFile(genericExe, executable);
8389

90+
// bootstrap script specified
91+
if (FileUtils.exists(packager.getScripts().getBootstrap())) {
92+
93+
// generates startup VBS script file
94+
File vbsFile = new File(appFolder, name + ".vbs");
95+
VelocityUtils.render(Platform.windows + "/startup.vbs.vtl", vbsFile, packager);
96+
executable = vbsFile;
97+
98+
}
99+
84100
return executable;
85101
}
86102

103+
/**
104+
* Renames assets required for launch4j to avoid unsupported characters (chinese, e.g.)
105+
* @param packager Windows packager
106+
* @throws Exception Something went wrong
107+
*/
87108
private void createAssets(WindowsPackager packager) throws Exception {
88109

89110
File manifestFile = packager.getManifestFile();
90111
File iconFile = packager.getIconFile();
91112
File jarFile = packager.getJarFile();
92113

93114
File launch4j = new File(Context.getGradleContext().getProject().getBuildDir(), "launch4j");
94-
if (!launch4j.exists()) launch4j.mkdirs();
115+
FileUtils.mkdir(launch4j);
95116

96117
genericManifest = new File(launch4j, "app.exe.manifest");
97118
genericIcon = new File(launch4j, "app.ico");

src/main/java/io/github/fvarrui/javapackager/maven/PackageMojo.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import io.github.fvarrui.javapackager.model.MacConfig;
2424
import io.github.fvarrui.javapackager.model.Manifest;
2525
import io.github.fvarrui.javapackager.model.Platform;
26+
import io.github.fvarrui.javapackager.model.Scripts;
2627
import io.github.fvarrui.javapackager.model.WindowsConfig;
2728
import io.github.fvarrui.javapackager.packagers.Context;
2829
import io.github.fvarrui.javapackager.packagers.Packager;
@@ -296,12 +297,18 @@ public class PackageMojo extends AbstractMojo {
296297
@Parameter(defaultValue = "${java.home}", property = "packagingJdk", required = false)
297298
private File packagingJdk;
298299

299-
300300
/**
301301
* Additional module paths
302302
*/
303303
@Parameter(property = "fileAssociations", required = false)
304304
private List<FileAssociation> fileAssociations;
305+
306+
/**
307+
* Scripts
308+
*/
309+
@Parameter(property = "scripts", required = false)
310+
private Scripts scripts;
311+
305312

306313
public void execute() throws MojoExecutionException {
307314

@@ -352,6 +359,7 @@ public void execute() throws MojoExecutionException {
352359
.outputDirectory(outputDirectory)
353360
.packagingJdk(packagingJdk)
354361
.runnableJar(runnableJar)
362+
.scripts(scripts)
355363
.useResourcesAsWorkingDir(useResourcesAsWorkingDir)
356364
.url(url)
357365
.version(version)

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static org.apache.commons.collections4.CollectionUtils.addIgnoreNull;
44
import static org.apache.commons.lang3.StringUtils.defaultIfBlank;
5+
import static org.apache.commons.io.FilenameUtils.getExtension;
56

67
import java.io.File;
78
import java.nio.file.InvalidPathException;
@@ -32,6 +33,7 @@ public abstract class Packager extends PackagerSettings {
3233
protected File executable;
3334
protected File jarFile;
3435
protected File libsFolder;
36+
protected File bootstrapFile;
3537

3638
// internal specific properties (setted in "doCreateAppStructure")
3739
protected File executableDestinationFolder;
@@ -75,6 +77,10 @@ public List<String> getClasspaths() {
7577
public File getJreDestinationFolder() {
7678
return jreDestinationFolder;
7779
}
80+
81+
public File getBootstrapFile() {
82+
return bootstrapFile;
83+
}
7884

7985
// ===============================================
8086

@@ -199,9 +205,10 @@ protected void copyAdditionalResources(List<File> resources, File destination) {
199205
});
200206

201207
// copy bootstrap script
202-
if (getScripts().getBootstrap() != null && getScripts().getBootstrap().exists()) {
208+
if (FileUtils.exists(getScripts().getBootstrap())) {
209+
String scriptExtension = getExtension(getScripts().getBootstrap().getName());
203210
File scriptsFolder = new File(destination, "scripts");
204-
File bootstrapFile = new File(scriptsFolder, "bootstrap");
211+
bootstrapFile = new File(scriptsFolder, "bootstrap" + (!scriptExtension.isEmpty() ? "." + scriptExtension : ""));
205212
try {
206213
FileUtils.copyFileToFile(getScripts().getBootstrap(), bootstrapFile);
207214
bootstrapFile.setExecutable(true, false);
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
' Windows startup script generated by JavaPackager plugin
2+
3+
' Runs an executable file (exe, bat, cmd, ...)
4+
Function Run(file)
5+
If FileExists(file) Then
6+
Set WshShell = CreateObject("WScript.Shell")
7+
WshShell.Run chr(34) & file & Chr(34), 0
8+
Set WshShell = Nothing
9+
End If
10+
End Function
11+
12+
' Checks if a file exists
13+
Function FileExists(FilePath)
14+
Set fso = CreateObject("Scripting.FileSystemObject")
15+
If fso.FileExists(FilePath) Then
16+
FileExists=CBool(1)
17+
Else
18+
FileExists=CBool(0)
19+
End If
20+
End Function
21+
22+
#if ($info.bootstrapFile)
23+
' Runs bootstrap script if exists
24+
Run "scripts\\${info.bootstrapFile.name}"
25+
#end
26+
27+
' Runs app executable
28+
Run "${info.executable.name}"

0 commit comments

Comments
 (0)