【问题标题】:Error: null, while compiling resource bundles under Linux with hudson错误:null,在 Linux 下使用 hudson 编译资源包时
【发布时间】:2011-04-21 06:07:24
【问题描述】:

我正在使用带有 hudson CI 服务器和 Ant 的 Flex 3.5.0.12683 来编译我们的项目。在为这个项目编译资源包时我遇到了问题。

使用 root 用户,一切都编译成功,但是当我尝试使用 hudson (ant) 编译我的 flex 项目时,它失败了:

compile_resource:
[mxmlc] Loading configuration file /opt/lib/flex3.5/frameworks/flex-config.xml
[mxmlc] Error: null
[mxmlc]
[mxmlc] java.lang.NullPointerException
[mxmlc]     at flex2.tools.CommandLineConfiguration.compilingResourceModule(CommandLineConfiguration.java:70)
[mxmlc]     at flex2.tools.CommandLineConfiguration.getTargetFile(CommandLineConfiguration.java:45)
[mxmlc]     at flex2.tools.CommandLineConfiguration.validate(CommandLineConfiguration.java:97)
[mxmlc]     at flex2.tools.Compiler.processConfiguration(Compiler.java:672)
[mxmlc]     at flex2.tools.Compiler.processConfiguration(Compiler.java:526)
[mxmlc]     at flex2.tools.Compiler.mxmlc(Compiler.java:84)
[mxmlc]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[mxmlc]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
[mxmlc]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[mxmlc]     at java.lang.reflect.Method.invoke(Method.java:616)
[mxmlc]     at flex.ant.FlexTask.executeInProcess(FlexTask.java:283)
[mxmlc]     at flex.ant.FlexTask.execute(FlexTask.java:225)
[mxmlc]     at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
[mxmlc]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[mxmlc]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
[mxmlc]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[mxmlc]     at java.lang.reflect.Method.invoke(Method.java:616)
[mxmlc]     at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
[mxmlc]     at org.apache.tools.ant.Task.perform(Task.java:348)
[mxmlc]     at org.apache.tools.ant.Target.execute(Target.java:390)
[mxmlc]     at org.apache.tools.ant.Target.performTasks(Target.java:411)
[mxmlc]     at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1360)
[mxmlc]     at org.apache.tools.ant.Project.executeTarget(Project.java:1329)
[mxmlc]     at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
[mxmlc]     at org.apache.tools.ant.Project.executeTargets(Project.java:1212)
[mxmlc]     at org.apache.tools.ant.Main.runBuild(Main.java:801)
[mxmlc]     at org.apache.tools.ant.Main.startAnt(Main.java:218)
[mxmlc]     at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
[mxmlc]     at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)

看起来有些权限失败了,但我不知道是什么以及在哪里,因为编译器没有太多输出。

【问题讨论】:

  • 刚刚查看了 CommandLineConfiguration.java 文件,发现失败的行:resourceModulePath = I18nUtils.getGeneratedResourceModule(this).getPath();似乎编译器找不到简单用户下的资源存储位置
  • 所以我猜测无论用户 hudson 运行的是什么,它都没有访问所需路径的一些权限。
  • 是的,看起来是这样。目前通过将 hudson 添加到具有运行 mxmlc 和 compc 的权限的 sudoers 文件来解决此问题。但是,这肯定不是真正的解决方案。
  • Debian 有没有办法检测 mxmlc 试图访问的路径?

标签: linux apache-flex ant hudson


【解决方案1】:

由于编译器在编译资源模块时会创建一个目录/tmp/Adobe/Flex/GeneratedResourceModules并在该目录下创建一个临时文件,如果超级用户首先在系统上编译其他普通用户无法创建临时文件.为了避免这种情况,我在普通用户编译之前执行了以下命令。

chmod a+w /tmp/Adobe/Flex/GeneratedResourceModules

rm -rf /tmp/Adobe

【讨论】:

    【解决方案2】:

    如果您没有超级用户权限,您还可以通过在 mxmlc ant 任务中设置 java.io.tmpdir 属性来更改编译器放置输出文件的位置:

    <java jar="${FLEX_HOME}/lib/mxmlc.jar" failonerror="true" fork="true">
      <jvmarg value="-Djava.io.tmpdir=${MY_OUTPUT_DIR}"/>
      ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      • 2012-07-27
      • 1970-01-01
      相关资源
      最近更新 更多