forked from MinecraftForge/ForgeGradle
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathLaunch4jPlugin.java
More file actions
210 lines (172 loc) · 7.58 KB
/
Launch4jPlugin.java
File metadata and controls
210 lines (172 loc) · 7.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
package edu.sc.seis.launch4j;
import groovy.lang.Closure;
import java.io.File;
import java.util.HashMap;
import net.minecraftforge.gradle.common.Constants;
import net.minecraftforge.gradle.tasks.EtagDownloadTask;
import net.minecraftforge.gradle.tasks.ExtractTask;
import org.gradle.api.Action;
import org.gradle.api.DefaultTask;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.Task;
import org.gradle.api.file.CopySpec;
import org.gradle.api.file.FileTree;
import org.gradle.api.file.FileVisitDetails;
import org.gradle.api.file.FileVisitor;
import org.gradle.api.plugins.JavaPlugin;
import org.gradle.api.tasks.JavaExec;
import org.gradle.api.tasks.Sync;
import org.gradle.api.tasks.bundling.Jar;
public class Launch4jPlugin implements Plugin<Project>
{
static final String LAUNCH4J_PLUGIN_NAME = "launch4j";
static final String LAUNCH4J_GROUP = LAUNCH4J_PLUGIN_NAME;
static final String LAUNCH4J_CONFIGURATION_NAME = LAUNCH4J_PLUGIN_NAME;
static final String TASK_XML_GENERATE_NAME = "generateXmlConfig";
static final String TASK_LIB_COPY_NAME = "copyL4jLib";
static final String TASK_DL = "downloadLaunch4J";
static final String TASK_EXTRACT = "extractLaunch4J";
static final String TASK_RUN_NAME = "createExe";
static final String TASK_LAUNCH4J_NAME = "launch4j";
static final String URL_LAUNCH4J = "https://files.minecraftforge.net/launch4j/launch4j-3.8.0-" + Constants.OPERATING_SYSTEM + ".zip";
static final String ZIP_LAUNCH4J = "build/launch4j.zip";
static final String DIR_LAUNCH4J = "build/launch4j";
private Project project;
public void apply(Project project)
{
this.project = project;
project.getConfigurations().create(LAUNCH4J_CONFIGURATION_NAME)
.setVisible(false)
.setTransitive(true)
.setDescription("The launch4j configuration for this project.");
project.getExtensions().add(LAUNCH4J_PLUGIN_NAME, Launch4jPluginExtension.class);
Launch4jPluginExtension ext = (Launch4jPluginExtension) project.getExtensions().getByName(LAUNCH4J_PLUGIN_NAME);
ext.initExtensionDefaults(project);
File downloadedLaunch4J = project.file(ZIP_LAUNCH4J);
File launch4JDir = project.file(DIR_LAUNCH4J);
Task dlTask = addDownloadTask(URL_LAUNCH4J, downloadedLaunch4J);
Task extractTask = addExtractTask(downloadedLaunch4J, launch4JDir);
extractTask.dependsOn(dlTask);
Task xmlTask = addCreateLaunch4jXMLTask(ext);
Task copyTask = addCopyToLibTask();
Task runTask = addRunLauch4jTask(launch4JDir);
runTask.dependsOn(extractTask, copyTask, xmlTask);
Task l4jTask = addLaunch4jTask();
l4jTask.dependsOn(runTask);
}
private Task addDownloadTask(String url, File output)
{
EtagDownloadTask dlTask = makeTask(TASK_DL, EtagDownloadTask.class);
dlTask.setFile(output);
dlTask.setUrl(url);
return dlTask;
}
private Task addExtractTask(final File input, final File output)
{
ExtractTask extractTask = makeTask(TASK_EXTRACT, ExtractTask.class);
extractTask.from(input);
extractTask.into(output);
extractTask.doLast(new Action<Task>() {
@Override
public void execute(Task task)
{
FileTree tree = project.fileTree(output.getPath() + "/bin");
tree.visit(new FileVisitor()
{
@Override
public void visitDir(FileVisitDetails dirDetails)
{
}
@Override
public void visitFile(FileVisitDetails fileDetails)
{
if (!fileDetails.getFile().canExecute())
{
boolean worked = fileDetails.getFile().setExecutable(true);
project.getLogger().info("Setting file +X " + worked + " : " + fileDetails.getPath());
}
}
});
}
});
return extractTask;
}
private Task addCreateLaunch4jXMLTask(Launch4jPluginExtension configuration)
{
CreateLaunch4jXMLTask task = makeTask(TASK_XML_GENERATE_NAME, CreateLaunch4jXMLTask.class);
task.setDescription("Creates XML configuration file used by launch4j to create an windows exe.");
task.setGroup(LAUNCH4J_GROUP);
task.getOutputs().upToDateWhen(Constants.CALL_FALSE);
return task;
}
@SuppressWarnings("serial")
private Task addCopyToLibTask()
{
final Sync task = makeTask(TASK_LIB_COPY_NAME, Sync.class);
task.setDescription("Copies the project dependency jars in the lib directory.");
task.setGroup(LAUNCH4J_GROUP);
// more stuff with the java plugin
//task.with(configureDistSpec(project));
task.into(new Closure<File>(Launch4jPlugin.class)
{
@Override
public File call(Object... obj)
{
Launch4jPluginExtension ext = ((Launch4jPluginExtension) task.getProject().getExtensions().getByName(Launch4jPlugin.LAUNCH4J_CONFIGURATION_NAME));
return task.getProject().file(task.getProject().getBuildDir() + "/" + ext.getOutputDir() + "/lib");
}
});
return task;
}
private Task addRunLauch4jTask(final File launch4JDir)
{
final JavaExec task = makeTask(TASK_RUN_NAME, JavaExec.class);
task.setDescription("Runs launch4j to generate an .exe file");
task.setGroup(LAUNCH4J_GROUP);
project.afterEvaluate(new Action<Project>() {
@Override
public void execute(Project project)
{
Launch4jPluginExtension ext = ((Launch4jPluginExtension) task.getProject().getExtensions().getByName(Launch4jPlugin.LAUNCH4J_CONFIGURATION_NAME));
task.setMain("net.sf.launch4j.Main");
task.args(project.getBuildDir() + "/" + ext.getOutputDir() + "/" + ext.getXmlFileName());
task.setWorkingDir(project.file(ext.getChdir()));
task.setClasspath(project.fileTree(launch4JDir));
}
});
return task;
}
private Task addLaunch4jTask()
{
DefaultTask task = makeTask(TASK_LAUNCH4J_NAME);
task.setDescription("Placeholder task for tasks relating to creating .exe applications with launch4j");
task.setGroup(LAUNCH4J_GROUP);
return task;
}
@SuppressWarnings({ "serial", "unused" })
private static CopySpec configureDistSpec(Project project)
{
CopySpec distSpec = project.copySpec(new Closure<Object>(Launch4jPlugin.class) {});
Jar jar = (Jar) project.getTasks().getByName(JavaPlugin.JAR_TASK_NAME);
distSpec.from(jar);
distSpec.from(project.getConfigurations().getByName("runtime"));
return distSpec;
}
public DefaultTask makeTask(String name)
{
return makeTask(name, DefaultTask.class);
}
public <T extends Task> T makeTask(String name, Class<T> type)
{
return makeTask(project, name, type);
}
@SuppressWarnings("unchecked")
public static <T extends Task> T makeTask(Project proj, String name, Class<T> type)
{
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("name", name);
map.put("type", type);
return (T) proj.task(map, name);
}
}