Add spigot server software option
This commit is contained in:
Generated
+6
-11
@@ -5,15 +5,10 @@
|
|||||||
</component>
|
</component>
|
||||||
<component name="ChangeListManager">
|
<component name="ChangeListManager">
|
||||||
<list default="true" id="98c311c3-6130-4449-9bcb-07029b56b776" name="Changes" comment="">
|
<list default="true" id="98c311c3-6130-4449-9bcb-07029b56b776" name="Changes" comment="">
|
||||||
<change afterPath="$PROJECT_DIR$/.gitignore" afterDir="false" />
|
<change afterPath="$PROJECT_DIR$/src/main/java/org/strassburger/mcrun/downloader/SpigotServerJarDownloader.java" afterDir="false" />
|
||||||
<change afterPath="$PROJECT_DIR$/.idea/encodings.xml" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||||
<change afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/pom.xml" afterDir="false" />
|
||||||
<change afterPath="$PROJECT_DIR$/.idea/vcs.xml" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/src/main/java/org/strassburger/mcrun/downloader/ServerJarDownloader.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/org/strassburger/mcrun/downloader/ServerJarDownloader.java" afterDir="false" />
|
||||||
<change afterPath="$PROJECT_DIR$/pom.xml" afterDir="false" />
|
|
||||||
<change afterPath="$PROJECT_DIR$/src/main/java/org/strassburger/mcrun/RunServerMojo.java" afterDir="false" />
|
|
||||||
<change afterPath="$PROJECT_DIR$/src/main/java/org/strassburger/mcrun/downloader/PaperServerJarDownloader.java" afterDir="false" />
|
|
||||||
<change afterPath="$PROJECT_DIR$/src/main/java/org/strassburger/mcrun/downloader/ServerJarDownloadException.java" afterDir="false" />
|
|
||||||
<change afterPath="$PROJECT_DIR$/src/main/java/org/strassburger/mcrun/downloader/ServerJarDownloader.java" afterDir="false" />
|
|
||||||
</list>
|
</list>
|
||||||
<option name="SHOW_DIALOG" value="false" />
|
<option name="SHOW_DIALOG" value="false" />
|
||||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||||
@@ -23,8 +18,8 @@
|
|||||||
<component name="FileTemplateManagerImpl">
|
<component name="FileTemplateManagerImpl">
|
||||||
<option name="RECENT_TEMPLATES">
|
<option name="RECENT_TEMPLATES">
|
||||||
<list>
|
<list>
|
||||||
<option value="Class" />
|
|
||||||
<option value="Exception" />
|
<option value="Exception" />
|
||||||
|
<option value="Class" />
|
||||||
</list>
|
</list>
|
||||||
</option>
|
</option>
|
||||||
</component>
|
</component>
|
||||||
@@ -61,7 +56,7 @@
|
|||||||
<updated>1779565206518</updated>
|
<updated>1779565206518</updated>
|
||||||
<workItem from="1779565207730" duration="57000" />
|
<workItem from="1779565207730" duration="57000" />
|
||||||
<workItem from="1779565274563" duration="632000" />
|
<workItem from="1779565274563" duration="632000" />
|
||||||
<workItem from="1779565913273" duration="4857000" />
|
<workItem from="1779565913273" duration="6524000" />
|
||||||
</task>
|
</task>
|
||||||
<servers />
|
<servers />
|
||||||
</component>
|
</component>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
<groupId>org.strassburger</groupId>
|
<groupId>org.strassburger</groupId>
|
||||||
<artifactId>mc-run</artifactId>
|
<artifactId>mc-run</artifactId>
|
||||||
<version>0.0.7</version>
|
<version>0.0.8</version>
|
||||||
<packaging>maven-plugin</packaging>
|
<packaging>maven-plugin</packaging>
|
||||||
|
|
||||||
<name>MCRun Maven Plugin</name>
|
<name>MCRun Maven Plugin</name>
|
||||||
|
|||||||
@@ -41,12 +41,18 @@ public abstract class ServerJarDownloader {
|
|||||||
return new File(serverDirectory, serverJarName);
|
return new File(serverDirectory, serverJarName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected File getServerDirectory() {
|
||||||
|
return serverDirectory;
|
||||||
|
}
|
||||||
|
|
||||||
protected abstract void downloadServerJar() throws ServerJarDownloadException;
|
protected abstract void downloadServerJar() throws ServerJarDownloadException;
|
||||||
|
|
||||||
public static Builder forServerSoftware(String serverSoftware) throws ServerJarDownloadException {
|
public static Builder forServerSoftware(String serverSoftware) throws ServerJarDownloadException {
|
||||||
return switch (serverSoftware) {
|
return switch (serverSoftware.toLowerCase()) {
|
||||||
case "paper" -> new Builder(b ->
|
case "paper", "papermc" -> new Builder(b ->
|
||||||
new PaperServerJarDownloader(b.log, b.serverDirectory, b.serverJarName, b.mcVersion));
|
new PaperServerJarDownloader(b.log, b.serverDirectory, b.serverJarName, b.mcVersion));
|
||||||
|
case "spigot" -> new Builder(b ->
|
||||||
|
new SpigotServerJarDownloader(b.log, b.serverDirectory, b.serverJarName, b.mcVersion));
|
||||||
default -> throw new ServerJarDownloadException("Invalid server software: " + serverSoftware);
|
default -> throw new ServerJarDownloadException("Invalid server software: " + serverSoftware);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,123 @@
|
|||||||
|
package org.strassburger.mcrun.downloader;
|
||||||
|
|
||||||
|
import org.apache.maven.plugin.logging.Log;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.StandardCopyOption;
|
||||||
|
|
||||||
|
public class SpigotServerJarDownloader extends ServerJarDownloader {
|
||||||
|
private static final String BUILD_TOOLS_URL =
|
||||||
|
"https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar";
|
||||||
|
|
||||||
|
public SpigotServerJarDownloader(Log log, File serverDirectory, String serverJarName, String mcVersion) {
|
||||||
|
super(log, serverDirectory, serverJarName, mcVersion);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void downloadServerJar() throws ServerJarDownloadException {
|
||||||
|
File spigotBuildDir = new File(getServerDirectory(), "spigot-build");
|
||||||
|
spigotBuildDir.mkdirs();
|
||||||
|
File buildToolsJar = new File(spigotBuildDir, "BuildTools.jar");
|
||||||
|
File builtJar = new File(spigotBuildDir, "spigot-" + getMcVersion() + ".jar");
|
||||||
|
|
||||||
|
try {
|
||||||
|
checkGitAvailable();
|
||||||
|
downloadBuildTools(buildToolsJar);
|
||||||
|
runBuildTools(buildToolsJar);
|
||||||
|
moveBuiltJar(builtJar);
|
||||||
|
cleanup(spigotBuildDir);
|
||||||
|
} catch (ServerJarDownloadException e) {
|
||||||
|
throw e;
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new ServerJarDownloadException("Failed to build Spigot: " + e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkGitAvailable() throws ServerJarDownloadException {
|
||||||
|
try {
|
||||||
|
new ProcessBuilder("git", "--version").start().waitFor();
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new ServerJarDownloadException("Git is not installed or not on PATH. Required for BuildTools.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void downloadBuildTools(File dest) throws ServerJarDownloadException {
|
||||||
|
getLog().info("Downloading BuildTools...");
|
||||||
|
try (var in = new java.net.URI(BUILD_TOOLS_URL).toURL().openStream()) {
|
||||||
|
Files.copy(in, dest.toPath(), StandardCopyOption.REPLACE_EXISTING);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new ServerJarDownloadException("Failed to download BuildTools: " + e.getMessage(), e);
|
||||||
|
}
|
||||||
|
getLog().info("BuildTools downloaded to: " + dest.getAbsolutePath());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void runBuildTools(File buildToolsJar) throws ServerJarDownloadException {
|
||||||
|
getLog().info("Running BuildTools for Minecraft " + getMcVersion() + " (this may take several minutes)...");
|
||||||
|
|
||||||
|
ProcessBuilder pb = new ProcessBuilder(
|
||||||
|
"java", "-jar", buildToolsJar.getAbsolutePath(),
|
||||||
|
"--rev", getMcVersion(),
|
||||||
|
"--compile", "spigot"
|
||||||
|
);
|
||||||
|
pb.directory(buildToolsJar.getParentFile());
|
||||||
|
pb.redirectErrorStream(true);
|
||||||
|
|
||||||
|
try {
|
||||||
|
Process process = pb.start();
|
||||||
|
|
||||||
|
// Stream BuildTools output to the Maven log
|
||||||
|
try (var reader = new BufferedReader(
|
||||||
|
new InputStreamReader(process.getInputStream()))) {
|
||||||
|
String line;
|
||||||
|
while ((line = reader.readLine()) != null) {
|
||||||
|
getLog().info("[Spigot-BuildTools] " + line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int exitCode = process.waitFor();
|
||||||
|
if (exitCode != 0) {
|
||||||
|
throw new ServerJarDownloadException("BuildTools exited with code " + exitCode);
|
||||||
|
}
|
||||||
|
} catch (IOException | InterruptedException e) {
|
||||||
|
if (e instanceof InterruptedException) Thread.currentThread().interrupt();
|
||||||
|
throw new ServerJarDownloadException("BuildTools process failed: " + e.getMessage(), e);
|
||||||
|
}
|
||||||
|
|
||||||
|
getLog().info("BuildTools finished successfully.");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void moveBuiltJar(File builtJar) throws ServerJarDownloadException {
|
||||||
|
if (!builtJar.exists()) {
|
||||||
|
throw new ServerJarDownloadException(
|
||||||
|
"Expected built jar not found: " + builtJar.getAbsolutePath() +
|
||||||
|
". Check BuildTools output above for errors."
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
File dest = getServerJar();
|
||||||
|
try {
|
||||||
|
Files.move(builtJar.toPath(), dest.toPath(), StandardCopyOption.REPLACE_EXISTING);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new ServerJarDownloadException("Failed to move built jar: " + e.getMessage(), e);
|
||||||
|
}
|
||||||
|
|
||||||
|
getLog().info("Spigot jar ready at: " + dest.getAbsolutePath());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void cleanup(File spigotBuildDir) {
|
||||||
|
getLog().info("Cleaning up Spigot-Build-tools...");
|
||||||
|
try {
|
||||||
|
Files.walk(spigotBuildDir.toPath())
|
||||||
|
.sorted(java.util.Comparator.reverseOrder())
|
||||||
|
.map(java.nio.file.Path::toFile)
|
||||||
|
.forEach(File::delete);
|
||||||
|
getLog().info("Cleaned up " + spigotBuildDir.getAbsolutePath());
|
||||||
|
} catch (IOException e) {
|
||||||
|
getLog().warn("Failed to clean up build directory: " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user