引用 java 源代码时将 Fantom 项目编译成 jar?
Compile a Fantom project into a jar when it references java source code?
我有一个 Fantom 项目,它使用了一些原生的 java 文件,并且可以成功编译成一个 pod。但是,我试图将它编译成一个 jar 文件,而不是让它对其他用户更便携。
我一直在尝试使用 JarDist 工具,但它需要一个 BuildScript 作为构造函数的输入,我不确定这个脚本需要是什么。
我得到的最接近的是使用以下构建脚本:
using build
class buildJar
{
public static Void main(){
jar := JarDist(Build())
jar.mainMethod = "Market::Meta.main"
jar.mainMethodArg = true
jar.outFile = File(`/c:/Users/ccase/Market.jar`)
jar.podNames = ["Market"]
jar.run
}
}
class Build : build::BuildPod
{
new make()
{
podName = "Market"
summary = ""
srcDirs = [`fan/`]
depends = ["sys 1.0+"]
}
}
这会产生以下错误代码
JarDist
Pod [sys]
Pod [Market]
JStub to classfiles
Exec [C:\Program Files (x86)\Java\jdk1.8.0_51\bin\java.exe -cp C:\fan\fantom-1.0.67\lib\java\sys.jar -Dfan.home=C:\Users\ccase\f4workspace\KeyGreen\bin\fan fanx.tools.Jstub -d C:\Users\ccase\f4workspace\KeyGreen\bin\fan\temp\jardist-b66da4d7bd01cae9 Market]
Java Stub [Market]
Exception in thread "main" sys::Err: Load from [Market] ProcessRunner.Wrapper
at fan.sys.Err.make(Err.java:78)
at fan.sys.Err.make(Err.java:68)
at fan.sys.Env.loadJavaType(Env.java:284)
at fan.sys.Pod.type(Pod.java:481)
at fan.sys.ClassType.map(ClassType.java:428)
at fan.sys.ClassType.doReflect(ClassType.java:321)
at fan.sys.ClassType.reflect(ClassType.java:282)
at fan.sys.ClassType.emitToClassFiles(ClassType.java:672)
at fanx.tools.Jstub.stub(Jstub.java:58)
at fanx.tools.Jstub.run(Jstub.java:160)
at fanx.tools.Jstub.main(Jstub.java:186)
ERR: Exec failed [C:\Program Files (x86)\Java\jdk1.8.0_51\bin\java.exe -cp C:\fan\fantom-1.0.67\lib\java\sys.jar -Dfan.home=C:\Users\ccase\f4workspace\KeyGreen\bin\fan fanx.tools.Jstub -d C:\Users\ccase\f4workspace\KeyGreen\bin\fan\temp\jardist-b66da4d7bd01cae9 Market]
build::FatalBuildErr: Exec failed [C:\Program Files (x86)\Java\jdk1.8.0_51\bin\java.exe -cp C:\fan\fantom-1.0.67\lib\java\sys.jar -Dfan.home=C:\Users\ccase\f4workspace\KeyGreen\bin\fan fanx.tools.Jstub -d C:\Users\ccase\f4workspace\KeyGreen\bin\fan\temp\jardist-b66da4d7bd01cae9 Market]
build::Task.fatal (Task.fan:61)
build::Task.fatal (Task.fan)
build::Exec.run (Exec.fan:33)
build::JarDist.podClasses (JarDist.fan:130)
build::JarDist.run (JarDist.fan:41)
fan.sys.List.each (List.java:588)
build::JarDist.run (JarDist.fan:41)
buildJar_0::buildJar.main (/C:/Users/ccase/f4workspace/Market/buildJar.fan:11)
java.lang.reflect.Method.invoke (Unknown)
fan.sys.Method.invoke (Method.java:559)
fan.sys.Method$MethodFunc.callList (Method.java:198)
fan.sys.Method.callList (Method.java:138)
fanx.tools.Fan.callMain (Fan.java:173)
fanx.tools.Fan.executeFile (Fan.java:98)
fanx.tools.Fan.execute (Fan.java:37)
fanx.tools.Fan.run (Fan.java:298)
fanx.tools.Fan.main (Fan.java:336)
ProcessRunner.Wrapper 是我在市场窗格中使用的 java 本机文件。
根据堆栈跟踪,程序正在死亡,因为此命令失败(或返回非零退出代码):
"C:\Program Files (x86)\Java\jdk1.8.0_51\bin\java.exe" -cp C:\fan\fantom-1.0.67\lib\java\sys.jar -Dfan.home=C:\Users\ccase\f4workspace\KeyGreen\bin\fan fanx.tools.Jstub -d C:\Users\ccase\f4workspace\KeyGreen\bin\fan\temp\jardist-b66da4d7bd01cae9 Market
单独尝试 运行 看看它是否能为您提供更多信息。
虽然您的脚本没有任何问题,但我相信 JarDist
任务的常见用法是这样的:
using build
class Build : BuildPod {
new make() {
podName = "Market"
summary = ""
srcDirs = [`fan/`]
depends = ["sys 1.0+"]
}
@Target { help = "Build my jar file" }
Void buildJar() {
JarDist(this) {
mainMethod = "Market::Meta.main"
mainMethodArg = true
outFile = File(`/c:/Users/ccase/Market.jar`)
podNames = ["Market"]
}.run
}
}
可以通过以下方式调用:
C:\> fan Build.fan buildJar
最后一点,如果您只是想打包您的应用程序,您可以尝试 AppBuilder
脚本,详见 Create Standalone Fantom Apps in Seconds!。
它创建一个 .zip
文件,其中包含一个最小的(独立的)Fantom 安装,它只运行您的 Market
pod。
这就是您所需要的:
class Wotever {
Void main() {
AppBuilder("Market") {
it.scriptArgs = "Market::Meta.main"
}.build
}
}
const class AppBuilder {
...
... Cut'n'Paste AppBuilder Script Here
...
}
运行 它与:
C:\> fan Wotever.fan
我有一个 Fantom 项目,它使用了一些原生的 java 文件,并且可以成功编译成一个 pod。但是,我试图将它编译成一个 jar 文件,而不是让它对其他用户更便携。
我一直在尝试使用 JarDist 工具,但它需要一个 BuildScript 作为构造函数的输入,我不确定这个脚本需要是什么。
我得到的最接近的是使用以下构建脚本:
using build
class buildJar
{
public static Void main(){
jar := JarDist(Build())
jar.mainMethod = "Market::Meta.main"
jar.mainMethodArg = true
jar.outFile = File(`/c:/Users/ccase/Market.jar`)
jar.podNames = ["Market"]
jar.run
}
}
class Build : build::BuildPod
{
new make()
{
podName = "Market"
summary = ""
srcDirs = [`fan/`]
depends = ["sys 1.0+"]
}
}
这会产生以下错误代码
JarDist
Pod [sys]
Pod [Market]
JStub to classfiles
Exec [C:\Program Files (x86)\Java\jdk1.8.0_51\bin\java.exe -cp C:\fan\fantom-1.0.67\lib\java\sys.jar -Dfan.home=C:\Users\ccase\f4workspace\KeyGreen\bin\fan fanx.tools.Jstub -d C:\Users\ccase\f4workspace\KeyGreen\bin\fan\temp\jardist-b66da4d7bd01cae9 Market]
Java Stub [Market]
Exception in thread "main" sys::Err: Load from [Market] ProcessRunner.Wrapper
at fan.sys.Err.make(Err.java:78)
at fan.sys.Err.make(Err.java:68)
at fan.sys.Env.loadJavaType(Env.java:284)
at fan.sys.Pod.type(Pod.java:481)
at fan.sys.ClassType.map(ClassType.java:428)
at fan.sys.ClassType.doReflect(ClassType.java:321)
at fan.sys.ClassType.reflect(ClassType.java:282)
at fan.sys.ClassType.emitToClassFiles(ClassType.java:672)
at fanx.tools.Jstub.stub(Jstub.java:58)
at fanx.tools.Jstub.run(Jstub.java:160)
at fanx.tools.Jstub.main(Jstub.java:186)
ERR: Exec failed [C:\Program Files (x86)\Java\jdk1.8.0_51\bin\java.exe -cp C:\fan\fantom-1.0.67\lib\java\sys.jar -Dfan.home=C:\Users\ccase\f4workspace\KeyGreen\bin\fan fanx.tools.Jstub -d C:\Users\ccase\f4workspace\KeyGreen\bin\fan\temp\jardist-b66da4d7bd01cae9 Market]
build::FatalBuildErr: Exec failed [C:\Program Files (x86)\Java\jdk1.8.0_51\bin\java.exe -cp C:\fan\fantom-1.0.67\lib\java\sys.jar -Dfan.home=C:\Users\ccase\f4workspace\KeyGreen\bin\fan fanx.tools.Jstub -d C:\Users\ccase\f4workspace\KeyGreen\bin\fan\temp\jardist-b66da4d7bd01cae9 Market]
build::Task.fatal (Task.fan:61)
build::Task.fatal (Task.fan)
build::Exec.run (Exec.fan:33)
build::JarDist.podClasses (JarDist.fan:130)
build::JarDist.run (JarDist.fan:41)
fan.sys.List.each (List.java:588)
build::JarDist.run (JarDist.fan:41)
buildJar_0::buildJar.main (/C:/Users/ccase/f4workspace/Market/buildJar.fan:11)
java.lang.reflect.Method.invoke (Unknown)
fan.sys.Method.invoke (Method.java:559)
fan.sys.Method$MethodFunc.callList (Method.java:198)
fan.sys.Method.callList (Method.java:138)
fanx.tools.Fan.callMain (Fan.java:173)
fanx.tools.Fan.executeFile (Fan.java:98)
fanx.tools.Fan.execute (Fan.java:37)
fanx.tools.Fan.run (Fan.java:298)
fanx.tools.Fan.main (Fan.java:336)
ProcessRunner.Wrapper 是我在市场窗格中使用的 java 本机文件。
根据堆栈跟踪,程序正在死亡,因为此命令失败(或返回非零退出代码):
"C:\Program Files (x86)\Java\jdk1.8.0_51\bin\java.exe" -cp C:\fan\fantom-1.0.67\lib\java\sys.jar -Dfan.home=C:\Users\ccase\f4workspace\KeyGreen\bin\fan fanx.tools.Jstub -d C:\Users\ccase\f4workspace\KeyGreen\bin\fan\temp\jardist-b66da4d7bd01cae9 Market
单独尝试 运行 看看它是否能为您提供更多信息。
虽然您的脚本没有任何问题,但我相信 JarDist
任务的常见用法是这样的:
using build
class Build : BuildPod {
new make() {
podName = "Market"
summary = ""
srcDirs = [`fan/`]
depends = ["sys 1.0+"]
}
@Target { help = "Build my jar file" }
Void buildJar() {
JarDist(this) {
mainMethod = "Market::Meta.main"
mainMethodArg = true
outFile = File(`/c:/Users/ccase/Market.jar`)
podNames = ["Market"]
}.run
}
}
可以通过以下方式调用:
C:\> fan Build.fan buildJar
最后一点,如果您只是想打包您的应用程序,您可以尝试 AppBuilder
脚本,详见 Create Standalone Fantom Apps in Seconds!。
它创建一个 .zip
文件,其中包含一个最小的(独立的)Fantom 安装,它只运行您的 Market
pod。
这就是您所需要的:
class Wotever {
Void main() {
AppBuilder("Market") {
it.scriptArgs = "Market::Meta.main"
}.build
}
}
const class AppBuilder {
...
... Cut'n'Paste AppBuilder Script Here
...
}
运行 它与:
C:\> fan Wotever.fan