Adding GraalVM native-image to 'ac' and 'acx'.

This commit is contained in:
Rob Greene
2025-08-25 19:58:23 -05:00
parent ce0aa4aa30
commit 4ca86ec6b7
18 changed files with 602 additions and 4 deletions

View File

@@ -1,6 +1,7 @@
plugins {
id 'org.springframework.boot' version "$springBoot"
id 'application'
id 'org.graalvm.buildtools.native' version "$graalvmBuildVersion"
}
java {
@@ -33,6 +34,13 @@ application {
mainClass = 'com.webcodepro.applecommander.ui.ac'
}
jar {
manifest {
attributes 'Implementation-Title': "AppleCommander 'ac'",
'Implementation-Version': archiveVersion
}
}
bootJar {
archiveBaseName = 'AppleCommander'
archiveAppendix = 'ac'
@@ -42,3 +50,13 @@ bootJar {
}
from('../../LICENSE')
}
graalvmNative {
String osName = System.getProperty('os.name').toLowerCase().split()[0]
String osArch = System.getProperty('os.arch').toLowerCase().split()[0]
binaries {
named("main") {
imageName.set("ac-${osName}-${osArch}-${project.version}")
}
}
}

View File

@@ -0,0 +1,6 @@
[
{
"name":"java.lang.Boolean",
"methods":[{"name":"getBoolean","parameterTypes":["java.lang.String"] }]
}
]

View File

@@ -0,0 +1,8 @@
[
{
"type":"agent-extracted",
"classes":[
]
}
]

View File

@@ -0,0 +1,2 @@
[
]

View File

@@ -0,0 +1,6 @@
[
{
"name":"com.webcodepro.applecommander.ui.ac",
"methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }]
}
]

View File

@@ -0,0 +1,12 @@
{
"resources":{
"includes":[{
"pattern":"\\QMETA-INF/services/java.net.spi.URLStreamHandlerProvider\\E"
}, {
"pattern":"\\QMETA-INF/services/java.util.spi.ResourceBundleControlProvider\\E"
}]},
"bundles":[{
"name":"com.webcodepro.applecommander.ui.UiBundle",
"locales":[""]
}]
}

View File

@@ -0,0 +1,8 @@
{
"types":[
],
"lambdaCapturingTypes":[
],
"proxies":[
]
}

View File

@@ -2,6 +2,7 @@ plugins {
id 'org.springframework.boot' version "$springBoot"
id 'java'
id 'application'
id 'org.graalvm.buildtools.native' version "$graalvmBuildVersion"
}
java {
@@ -22,6 +23,8 @@ dependencies {
implementation "net.sf.applecommander:acdasm:$acdasmVersion"
implementation "com.google.code.gson:gson:$gsonVersion"
annotationProcessor "info.picocli:picocli-codegen:$picocliVersion"
testImplementation platform("org.junit:junit-bom:$junitVersion")
testImplementation 'org.junit.jupiter:junit-jupiter'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
@@ -35,6 +38,13 @@ application {
mainClass = 'io.github.applecommander.acx.Main'
}
jar {
manifest {
attributes 'Implementation-Title': "AppleCommander 'acx'",
'Implementation-Version': archiveVersion
}
}
bootJar {
archiveBaseName = 'AppleCommander'
archiveAppendix = 'acx'
@@ -44,3 +54,13 @@ bootJar {
}
from('../../LICENSE')
}
graalvmNative {
String osName = System.getProperty('os.name').toLowerCase().split()[0]
String osArch = System.getProperty('os.arch').toLowerCase().split()[0]
binaries {
named("main") {
imageName.set("acx-${osName}-${osArch}-${project.version}")
}
}
}

View File

@@ -0,0 +1,12 @@
# README
These files were generated for the AppleCommander disassembler and it's usage within 'acx'. Hypothetically, once
the disassembler project gets updated for GraalVM native image capabilities, these files can be removed.
Generation command:
```shell
$ java -agentlib:native-image-agent=config-merge-dir=app/cli-acx/src/main/resources/META-INF/native-image \
-jar app/cli-acx/build/libs/AppleCommander-acx-12.0-SNAPSHOT.jar \
dump -d deleteme.po -b 0 --disassembly
```

View File

@@ -0,0 +1,6 @@
[
{
"name":"java.lang.Boolean",
"methods":[{"name":"getBoolean","parameterTypes":["java.lang.String"] }]
}
]

View File

@@ -0,0 +1,8 @@
[
{
"type":"agent-extracted",
"classes":[
]
}
]

View File

@@ -0,0 +1,403 @@
[
{
"name":"groovy.lang.Closure"
},
{
"name":"io.github.applecommander.acx.Main",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"methods":[{"name":"main","parameterTypes":["java.lang.String[]"] }]
},
{
"name":"io.github.applecommander.acx.VersionProvider",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"methods":[{"name":"<init>","parameterTypes":[] }]
},
{
"name":"io.github.applecommander.acx.arggroup.CoordinateSelection",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.arggroup.CoordinateSelection$BlockCoordinateSelection",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.arggroup.CoordinateSelection$SectorCoordinateSelection",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.base.ReadOnlyDiskImageCommandOptions",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.base.ReadWriteDiskCommandOptions",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.base.ReadWriteDiskCommandWithGlobOptions",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.base.ReusableCommandOptions",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.command.CompareCommand",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"methods":[{"name":"<init>","parameterTypes":[] }]
},
{
"name":"io.github.applecommander.acx.command.CompareCommand$StrategySelection",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.command.ConvertCommand",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.command.CopyFileCommand",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.command.CreateDiskCommand",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"methods":[{"name":"<init>","parameterTypes":[] }]
},
{
"name":"io.github.applecommander.acx.command.CreateDiskCommand$OrderSelection",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.command.CreateDiskCommand$SystemSelection",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.command.DeleteCommand",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.command.DiskMapCommand",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.command.DumpCommand",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"methods":[{"name":"<init>","parameterTypes":[] }]
},
{
"name":"io.github.applecommander.acx.command.DumpCommand$BlockRangeSelection",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"methods":[{"name":"<init>","parameterTypes":[] }]
},
{
"name":"io.github.applecommander.acx.command.DumpCommand$CoordinateRangeSelection",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"methods":[{"name":"<init>","parameterTypes":[] }]
},
{
"name":"io.github.applecommander.acx.command.DumpCommand$DisassemblerOptions",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.command.DumpCommand$DisassemblerOptions$InstructionSetSelection",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.command.DumpCommand$Options",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.command.DumpCommand$OutputSelection",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"methods":[{"name":"<init>","parameterTypes":[] }, {"name":"selectDisassembly","parameterTypes":["boolean"] }]
},
{
"name":"io.github.applecommander.acx.command.DumpCommand$TrackSectorRangeSelection",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.command.ExportCommand",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"methods":[{"name":"<init>","parameterTypes":[] }]
},
{
"name":"io.github.applecommander.acx.command.ExportCommand$FileExtractMethods",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.command.FindDuplicateFilesCommand",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.command.ImportCommand",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"methods":[{"name":"<init>","parameterTypes":[] }]
},
{
"name":"io.github.applecommander.acx.command.ImportCommand$InputData",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.command.ImportCommand$Overrides",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.command.ImportCommand$Processor",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.command.InfoCommand",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.command.ListCommand",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"methods":[{"name":"<init>","parameterTypes":[] }]
},
{
"name":"io.github.applecommander.acx.command.ListCommand$FileDisplay",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.command.ListCommand$OutputType",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.command.ListCommand$TypeOfFileSelection",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.command.LockCommand",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.command.MkdirCommand",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.command.ReadCommand",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"methods":[{"name":"<init>","parameterTypes":[] }]
},
{
"name":"io.github.applecommander.acx.command.ReadCommand$OutputSelection",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.command.RenameDiskCommand",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.command.RenameFileCommand",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.command.RmdirCommand",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.command.ScanCommand",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.command.UnlockCommand",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.command.WriteCommand",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"methods":[{"name":"<init>","parameterTypes":[] }]
},
{
"name":"io.github.applecommander.acx.command.WriteCommand$InputSelection",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"io.github.applecommander.acx.converter.DataSizeConverter",
"methods":[{"name":"<init>","parameterTypes":[] }]
},
{
"name":"io.github.applecommander.acx.converter.DiskConverter",
"methods":[{"name":"<init>","parameterTypes":[] }]
},
{
"name":"io.github.applecommander.acx.converter.ExportMethodConverter",
"methods":[{"name":"<init>","parameterTypes":[] }]
},
{
"name":"io.github.applecommander.acx.converter.ExportMethodConverter$ExportMethodCandidates",
"methods":[{"name":"<init>","parameterTypes":[] }]
},
{
"name":"io.github.applecommander.acx.converter.IntegerTypeConverter",
"methods":[{"name":"<init>","parameterTypes":[] }]
},
{
"name":"io.github.applecommander.acx.converter.RangeTypeConverter",
"methods":[{"name":"<init>","parameterTypes":[] }]
},
{
"name":"java.lang.Object",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"java.lang.Runtime",
"methods":[{"name":"version","parameterTypes":[] }]
},
{
"name":"java.lang.Runtime$Version",
"methods":[{"name":"major","parameterTypes":[] }]
},
{
"name":"java.nio.file.Path"
},
{
"name":"java.nio.file.Paths",
"methods":[{"name":"get","parameterTypes":["java.lang.String","java.lang.String[]"] }]
},
{
"name":"java.sql.Connection"
},
{
"name":"java.sql.Driver"
},
{
"name":"java.sql.DriverManager",
"methods":[{"name":"getConnection","parameterTypes":["java.lang.String"] }, {"name":"getDriver","parameterTypes":["java.lang.String"] }]
},
{
"name":"java.sql.Time",
"methods":[{"name":"<init>","parameterTypes":["long"] }]
},
{
"name":"java.sql.Timestamp",
"methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }]
},
{
"name":"java.time.Duration",
"methods":[{"name":"parse","parameterTypes":["java.lang.CharSequence"] }]
},
{
"name":"java.time.Instant",
"methods":[{"name":"parse","parameterTypes":["java.lang.CharSequence"] }]
},
{
"name":"java.time.LocalDate",
"methods":[{"name":"parse","parameterTypes":["java.lang.CharSequence"] }]
},
{
"name":"java.time.LocalDateTime",
"methods":[{"name":"parse","parameterTypes":["java.lang.CharSequence"] }]
},
{
"name":"java.time.LocalTime",
"methods":[{"name":"parse","parameterTypes":["java.lang.CharSequence"] }]
},
{
"name":"java.time.MonthDay",
"methods":[{"name":"parse","parameterTypes":["java.lang.CharSequence"] }]
},
{
"name":"java.time.OffsetDateTime",
"methods":[{"name":"parse","parameterTypes":["java.lang.CharSequence"] }]
},
{
"name":"java.time.OffsetTime",
"methods":[{"name":"parse","parameterTypes":["java.lang.CharSequence"] }]
},
{
"name":"java.time.Period",
"methods":[{"name":"parse","parameterTypes":["java.lang.CharSequence"] }]
},
{
"name":"java.time.Year",
"methods":[{"name":"parse","parameterTypes":["java.lang.CharSequence"] }]
},
{
"name":"java.time.YearMonth",
"methods":[{"name":"parse","parameterTypes":["java.lang.CharSequence"] }]
},
{
"name":"java.time.ZoneId",
"methods":[{"name":"of","parameterTypes":["java.lang.String"] }]
},
{
"name":"java.time.ZoneOffset",
"methods":[{"name":"of","parameterTypes":["java.lang.String"] }]
},
{
"name":"java.time.ZonedDateTime",
"methods":[{"name":"parse","parameterTypes":["java.lang.CharSequence"] }]
},
{
"name":"org.ini4j.spi.EscapeTool",
"methods":[{"name":"<init>","parameterTypes":[] }]
},
{
"name":"org.ini4j.spi.IniBuilder",
"methods":[{"name":"<init>","parameterTypes":[] }]
},
{
"name":"org.ini4j.spi.IniParser",
"methods":[{"name":"<init>","parameterTypes":[] }]
},
{
"name":"picocli.CommandLine$AutoHelpMixin",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
},
{
"name":"picocli.CommandLine$HelpCommand",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true
}
]

View File

@@ -0,0 +1,31 @@
{
"resources":{
"includes":[{
"pattern":"\\QMETA-INF/services/com.webcodepro.applecommander.storage.DiskFactory\\E"
}, {
"pattern":"\\QMETA-INF/services/java.lang.System$LoggerFinder\\E"
}, {
"pattern":"\\QMETA-INF/services/java.time.zone.ZoneRulesProvider\\E"
}, {
"pattern":"\\QMETA-INF/services/java.util.spi.ResourceBundleControlProvider\\E"
}, {
"pattern":"\\QMETA-INF/services/org.applecommander.source.Source$Factory\\E"
}, {
"pattern":"\\QMETA-INF/services/org.ini4j.spi.EscapeTool\\E"
}, {
"pattern":"\\QMETA-INF/services/org.ini4j.spi.IniBuilder\\E"
}, {
"pattern":"\\QMETA-INF/services/org.ini4j.spi.IniParser\\E"
}, {
"pattern":"\\Qaddresses.ini\\E"
}, {
"pattern":"\\Qcom/webcodepro/applecommander/storage/os/prodos/ProdosFileTypes.properties\\E"
}]},
"bundles":[{
"name":"com.webcodepro.applecommander.storage.StorageBundle",
"locales":[""]
}, {
"name":"com.webcodepro.applecommander.util.TextBundle",
"locales":[""]
}]
}

View File

@@ -0,0 +1,8 @@
{
"types":[
],
"lambdaCapturingTypes":[
],
"proxies":[
]
}

View File

@@ -13,6 +13,8 @@ ext {
commonsCsvVersion = "1.14.1"
gsonVersion = "2.13.1"
picocliVersion = "4.7.7"
springBoot = "3.5.4"
// 3.0(?) introduced Spring AOT automatic stuff and breaks when using GraalVM native image
springBoot = "2.7.7"
acdasmVersion = "0.5.0"
graalvmBuildVersion = "0.10.6"
}

8
dev.sh
View File

@@ -5,6 +5,8 @@ platform=$(uname | tr '[:upper:]' '[:lower:]')
machine=$(uname -m | tr '[:upper:]' '[:lower:]')
# These are useful aliases while developing
alias ac='java -jar app/cli-ac/build/libs/AppleCommander-ac-*.jar'
alias acx='java -jar app/cli-acx/build/libs/AppleCommander-acx-*.jar'
alias acgui='java -jar app/gui-swt-linux-x86_64/build/libs/AppleCommander-${platform}-${machine}-*.jar'
alias ac='java -jar ${PWD}/app/cli-ac/build/libs/AppleCommander-ac-*.jar'
alias acn='${PWD}/app/cli-ac/build/native/nativeCompile/ac-*'
alias acx='java -jar ${PWD}/app/cli-acx/build/libs/AppleCommander-acx-*.jar'
alias acxn='${PWD}/app/cli-acx/build/native/nativeCompile/acx-*'
alias acgui='java -jar ${PWD}/app/gui-swt-linux-x86_64/build/libs/AppleCommander-${platform}-${machine}-*.jar'

View File

@@ -0,0 +1,44 @@
{
"resources": {
"includes": [
{
"pattern": "META-INF/MANIFEST.MF"
},
{
"pattern": "META-INF/services/*"
},
{
"pattern": "com/webcodepro/applecommander/storage/os/prodos/*"
},
{
"pattern": "com/webcodepro/applecommander/storage/*"
},
{
"pattern": "com/webcodepro/applecommander/ui/*"
},
{
"pattern": "com/webcodepro/applecommander/util/*"
}
]
},
"bundles": [
{
"name": "com.webcodepro.applecommander.storage.StorageBundle",
"locales": [
"und"
]
},
{
"name": "com.webcodepro.applecommander.util.UiBundle",
"locales": [
"und"
]
},
{
"name": "com.webcodepro.applecommander.util.TextBundle",
"locales": [
"und"
]
}
]
}