【问题标题】:Compile a Fantom project into a jar when it references java source code?Fantom项目在引用java源代码时编译成jar?
【发布时间】:2015-08-06 22:32:01
【问题描述】:

我有一个 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 是我在 Market pod 中使用的 java 本机文件。

【问题讨论】:

    标签: java fantom


    【解决方案1】:

    在堆栈跟踪之后,程序正在死亡,因为此命令失败(或返回非零退出代码):

    "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
    

    【讨论】:

    • 我刚刚使用了 AppBuilder,效果很好。但是,我必须手动将 icons.pod 添加到 lib/fan 目录,因为它没有获取该依赖项。这适用于使用 fwt 和其中一些图标的应用程序。
    • icons.pod 有点棘手,因为您可以在不将其添加为依赖项的情况下使用它 - 这有点顽皮。如果您将它添加为依赖项(它就是!),那么一切都应该按预期工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 2016-08-19
    • 2011-02-06
    • 2023-03-05
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多