BlackBerry:在Ant脚本中从JAR源文件创建COD

Ric*_*ier 5 ant blackberry

如何使用Ant(bb-ant-tools)将JAR文件编译为COD?即没有其他源文件


原因

最终,我需要一个在构建期间运行Jar Jar Links(jarjar)的脚本,以解决在多个应用程序中使用我们的sdk的命名空间问题.Jarjar将JAR文件作为输入,我假设它输出一个JAR文件.

因此,要在bb-ant-tools构建中运行jarjar,我需要知道如何将输出JAR编译成COD.

我只关注这部分问题,以尽量减少其他可能的错误来源.一旦我可以掌握将JAR构建到COD中,我将尝试jarjar步骤.

进展

1)我可以将我的项目构建到工作COD中,在设备上签名并运行.

2)要包含sdk代码,我目前将源文件夹添加到主项目构建中.(将来我想知道如何将库作为JAR包含在构建中 - BlackBerry-Ant脚本将JAR包含在没有外部依赖的项目中)

3)此步骤的输出包括通常的文件:

  • MyApp.cod(如果我签名,它在设备上运行完美)
  • MyApp.csl
  • MyApp.cso
  • MyApp.debug
  • MyApp.jad
  • MyApp.jar(我想在这上面运行jarjar)
  • MyApp.rapc

4)我尝试运行第二个构建,获取上面的JAR文件并将其用作rapc调用中唯一的源文件.我通过将src标记指向rapc仅包含我的JAR文件的文件夹来执行此操作.

在构建的最后部分,当rapc是adding文件时,我收到错误:

 java.util.zip.ZipException: duplicate entry: MyApp-1.cod
Run Code Online (Sandbox Code Playgroud)

(已编辑的构建输出中的错误的完整详细信息)

我可以看到这是rapc第二次尝试添加此文件.我不明白为什么,因为JAR中只有该文件的一个副本.


构建输出(编辑...etc以使其可读)

build:
    [mkdir] Skipping C:\development\ant\new_test\MyApp\build because it already exists.
     [copy] Copying 1 file to C:\development\ant\new_test\MyApp\build
     [copy] Copying C:\development\ant\new_test\MyApp\icon.png to C:\development\ant\new_test\MyApp\build\icon.png
     [rapc] Compiling 1 source files to MyApp.cod
     [rapc] Executing 'C:\Java\jdk1.6.0_24\jre\bin\java.exe' with arguments:
     [rapc] '-classpath'
     [rapc] 'C:\Java\jdk1.6.0_24\lib\tools.jar;C:\development\tools\bb-jde\jde5.0\components\bin\rapc.jar'
     [rapc] 'net.rim.tools.compiler.Compiler'
     [rapc] '-verbose'
     [rapc] 'import=C:\development\tools\bb-jde\jde5.0\components\lib\net_rim_api.jar'
     [rapc] 'codename=MyApp'
     [rapc] 'MyApp.rapc'
     [rapc] '@sources.txt'
     [rapc]
     [rapc] The ' characters around the executable and arguments are
     [rapc] not part of the command.
     [rapc] Setting environment variable: PATH=........etc
     [rapc] Reading resource: MyApp.cod
...etc
     [rapc] Parsing classfile: com/MyApp/ui/views/WelcomeBar.class
...etc
     [rapc] Parsing import: C:\development\tools\bb-jde\jde5.0\components\lib\net_rim_api.jar(net_rim_amms.cod)
...etc
     [rapc] Resolving
...etc
     [rapc] Optimizing
     [rapc] Utilities.java:449: Warning!: local variable(s) { finished } initialized but not used in: com.cobi.library.Utilities.split(String,String)
...etc
     [rapc] Populating
     [rapc] Invoking: jar -cfmv C:\development\ant\new_test\MyApp\build\MyApp.jar C:\Users\Richard\AppData\Local\Temp\rapc_598c0c5a.dir\META-INF\MANIFEST.MF MyApp.cod MyApp-1.cod MyApp-2.cod MyApp.csl MyApp.cso -C C:\Users\Richard\AppData\Local\Temp\rapc_598c2ad7.dir .
     [rapc] added manifest
     [rapc] adding: MyApp.cod(in = 63208) (out= 41042)(deflated 35%)
     [rapc] adding: MyApp-1.cod(in = 75448) (out= 42559)(deflated 43%)
     [rapc] adding: MyApp.csl(in = 91) (out= 69)(deflated 24%)
     [rapc] adding: MyApp.cso(in = 157) (out= 93)(deflated 40%)
...etc - adding all files I can see in the JAR...

     [rapc] adding: MyApp-1.cod

     java.util.zip.ZipException: duplicate entry: MyApp-1.cod
     [rapc]     at java.util.zip.ZipOutputStream.putNextEntry(ZipOutputStream.java:175)
     [rapc]     at java.util.jar.JarOutputStream.putNextEntry(JarOutputStream.java:92)
     [rapc]     at sun.tools.jar.Main.addFile(Main.java:713)
     [rapc]     at sun.tools.jar.Main.create(Main.java:466)
     [rapc]     at sun.tools.jar.Main.run(Main.java:180)
     [rapc]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
     [rapc]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
     [rapc]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
     [rapc]     at java.lang.reflect.Method.invoke(Method.java:597)
     [rapc]     at net.rim.tools.compiler.c.e.if(Unknown Source)
     [rapc]     at net.rim.tools.compiler.c.e.a(Unknown Source)
     [rapc]     at net.rim.tools.compiler.Compiler.a(Unknown Source)
     [rapc]     at net.rim.tools.compiler.Compiler.a(Unknown Source)
     [rapc]     at net.rim.tools.compiler.Compiler.compile(Unknown Source)
     [rapc]     at net.rim.tools.compiler.Compiler.main(Unknown Source)

     [rapc] java.io.IOException: jar command failed: jar -cfmv C:\development\ant\new_test\MyApp\build\MyApp.jar C:\Users\Richard\AppData\Local\Temp\rapc_598c0c5a.dir\META-INF\MANIFEST.MF MyApp.cod MyApp-1.cod MyApp-2.cod MyApp.csl MyApp.cso -C C:\Users\Richard\AppData\Local\Temp\rapc_598c2ad7.dir .
     [rapc]     at net.rim.tools.compiler.Compiler.a(Unknown Source)
     [rapc]     at net.rim.tools.compiler.Compiler.a(Unknown Source)
     [rapc]     at net.rim.tools.I/O Error: jar command failed: jar -cfmv C:\development\ant\new_test\MyApp\build\MyApp.jar C:\Users\Richard\AppData\Local\Temp\rapc_598c0c5a.dir\META-INF\MANIFEST.MF MyApp.cod MyApp-1.cod MyApp-2.cocompiler.Compiler.compile(Unknown Source)
     [rapc]     at net.rim.tools.compiler.Compiler.main(Unknown Source)
     [rapc] d MyApp.csl MyApp.cso -C C:\Users\Richard\AppData\Local\Temp\rapc_598c2ad7.dir .

BUILD FAILED
C:\development\ant\new_test\MyApp\build.xml:65: Java returned: -1
        at org.apache.tools.ant.taskdefs.Java.execute(Java.java:111)
        at ca.slashdev.bb.tasks.RapcTask.executeRapc(RapcTask.java:583)
        at ca.slashdev.bb.tasks.RapcTask.execute(RapcTask.java:401)
        at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
        at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
        at org.apache.tools.ant.Task.perform(Task.java:348)
        at org.apache.tools.ant.Target.execute(Target.java:390)
        at org.apache.tools.ant.Target.performTasks(Target.java:411)
        at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399)
        at org.apache.tools.ant.Project.executeTarget(Project.java:1368)
        at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
        at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
        at org.apache.tools.ant.Main.runBuild(Main.java:809)
        at org.apache.tools.ant.Main.startAnt(Main.java:217)
        at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
        at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)

Total time: 9 seconds

C:\development\ant\new_test\MyApp>
Run Code Online (Sandbox Code Playgroud)

解决方法

Esaj下面有一个很好的答案,replace在编译之前在源代码上运行Ant 任务.这意味着无需jarjar在任何生成的JAR文件上运行来解决命名空间问题.

这对我有用,因为我有SDK源代码.它不适用于我的客户,因为我以JAR格式分发我的SDK.所以我仍然希望能够回答这个问题.


有关

[ 如何使用Ant Build将JAR FILE转换为COD文件 ] 的副本,但该问题尚未得到解答,我添加了更多详细信息.

不是重复的:

Ric*_*ier 0

用一些细节回答我自己的问题......

不能rapc多次调用 - 它会创建太多 COD 文件。这就是我收到该错误的原因。

根据Michael 的回答,正确的方法是使用普通的 java 工具(javac 和 jar)以及 RIM 的preverify命令来构建最终的 JAR 文件。

仅用于rapc最后一步 - 将该 JAR 文件转换为 COD。

处理此问题的完整 ANT 构建框架太大,无法放在这里,但下面列出了创建它所需的步骤。每个步骤都可以在这个网站上(或通过谷歌)轻松研究。每一步都非常简单,可以单独调试。

脚步

  1. javacSDK创建CLASS文件
  2. preverify类文件
  3. jar软件开发工具包
  4. 将SDK JAR文件复制到项目中
  5. javac项目 - 使用 SDK JAR 作为类路径
  6. preverify项目 CLASS 文件(同样,在类路径中使用 SDK JAR )
  7. jar项目 - 将 SDK JAR 添加为zipfileset
  8. jarjar该项目 JAR 根据需要重构包名称
  9. 最后,运行rapc这个 JAR - 它将发现没有重复的 COD 文件并且应该运行良好。

注意rapc:只需在 SDK 上使用即可组合步骤 1-3 (如果您需要在 SDK 代码上运行预处理器标记,则需要这样做)。

通过将其分解为这样的简单步骤,我了解了普通的 java 工具如何链接到 RIM 的工具链(通常,当您简单地调用rapc源文件夹时,这一切都是隐藏的)。

当然,您仍然需要在 COD 上签名sigtool

我在 ANT 中完成所有这些工作。我使用不同的文件夹来存储每个步骤的输出。这样我最终会得到 5 个临时文件夹,但它使我可以轻松地调试步骤。


我现在终于明白为什么很少有人能够对我的各种 BB ANT 构建脚本问题提供决定性的答案。这个过程既费力又漫长,而且很难解释。

完成此任务的完整 ANT 构建框架可以跨越许多不同的文件(在我的例子中,我认为我现在使用 8 个文件,包括属性文件)。它需要对 ANT、普通 java 构建工具和 RIMrapc命令有良好的应用知识。

我认为我已经在有关此问题的问题中很好地记录了该过程的每一步,并在此过程中获得了一些很好的答案。有关更多详细信息,请查看其他问题和答案。每个都包含有用的链接,以及来自该社区其他开发人员的一些很好的见解