1
0
mirror of git://f0xx.org/ac/ac-session-studio synced 2026-07-29 01:38:39 +03:00

session-studio: runnable jar — shadow fat jar + module-path launcher + wrapper script

- Launcher.java: non-Application Main-Class entry point (bypasses JVM Application subclass check)
- build.gradle: shadow plugin 8.1.1 for fat jar; startScripts patched with --module-path \$APP_HOME/lib + --add-modules; generateWrapper task writes project-root ./ac-session-studio script
- ac-session-studio: generated launcher wrapper (./ac-session-studio to run)

java -jar build/libs/ac-session-studio.jar still requires --module-path; use ./ac-session-studio instead

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Anton Afanasyeu
2026-06-25 18:10:39 +02:00
parent 56be92690a
commit 4cfa7ceaec
3 changed files with 72 additions and 0 deletions

4
ac-session-studio Executable file
View File

@@ -0,0 +1,4 @@
#!/bin/sh
# Auto-generated launcher wrapper — re-run ./gradlew generateWrapper to refresh
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
exec "${SCRIPT_DIR}/build/install/ac-session-studio/bin/ac-session-studio" "$@"

View File

@@ -1,6 +1,7 @@
plugins {
id 'application'
id 'org.openjfx.javafxplugin' version '0.1.0'
id 'com.github.johnrengelman.shadow' version '8.1.1'
}
repositories {
@@ -22,6 +23,54 @@ application {
mainClass = 'com.foxx.androidcast.studio.SessionStudioApp'
}
// Patch generated Unix start script to add --module-path $APP_HOME/lib.
tasks.named('startScripts').configure {
doLast {
def script = unixScript
// Replace the -classpath line to also include --module-path before it
script.text = script.text.replace(
' -classpath "$CLASSPATH" \\',
' --module-path "$APP_HOME/lib" \\\n --add-modules javafx.controls,javafx.graphics,javafx.base \\\n -classpath "$CLASSPATH" \\'
)
}
}
dependencies {
implementation 'org.json:json:20240303'
}
jar {
manifest {
attributes 'Main-Class': 'com.foxx.androidcast.studio.Launcher'
}
}
shadowJar {
archiveBaseName = 'ac-session-studio'
archiveClassifier = ''
archiveVersion = ''
manifest {
attributes 'Main-Class': 'com.foxx.androidcast.studio.Launcher'
}
mergeServiceFiles()
}
// After installDist, generate a convenience wrapper at the project root
tasks.register('generateWrapper') {
dependsOn installDist
doLast {
def wrapper = file("${rootProject.projectDir}/ac-session-studio")
def distBin = "${buildDir}/install/ac-session-studio/bin/ac-session-studio"
wrapper.text = """\
#!/bin/sh
# Auto-generated launcher wrapper — re-run ./gradlew generateWrapper to refresh
SCRIPT_DIR="\$(cd "\$(dirname "\$0")" && pwd)"
exec "\${SCRIPT_DIR}/build/install/ac-session-studio/bin/ac-session-studio" "\$@"
"""
wrapper.setExecutable(true)
println "Wrapper written: ${wrapper}"
}
}
// Also attach generateWrapper to the standard build lifecycle
build.dependsOn generateWrapper

View File

@@ -0,0 +1,19 @@
package com.foxx.androidcast.studio;
/**
* Fat-jar entry point that does NOT extend javafx.application.Application.
*
* On Java 9+ the JVM checks whether Main-Class is an Application subclass and
* refuses to launch it from a classpath jar when JavaFX modules are not on the
* explicit module path. Delegating through this plain class bypasses that check.
*
* For direct execution use the generated wrapper script instead of java -jar:
* ./build/install/ac-session-studio/bin/ac-session-studio
* or the project-root wrapper:
* ./ac-session-studio
*/
public final class Launcher {
public static void main(String[] args) {
SessionStudioApp.main(args);
}
}