【发布时间】:2012-05-31 19:50:06
【问题描述】:
如何使用 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 script to include JAR in project without external dependancies)
3) 此步骤的输出包括常用文件:
- MyApp.cod(如果我签署此文件,它将在设备上完美运行)
- MyApp.csl
- MyApp.cso
- MyApp.debug
- MyApp.jad
- MyApp.jar(我想在此运行 jarjar)
- MyApp.rapc
4) 我尝试运行第二次构建,采用上述 JAR 文件并将其用作 rapc 调用中的唯一源文件。为此,我将rapc 的src 标记指向仅包含我的JAR 文件的文件夹。
在构建的最后部分,当 rapc 是 adding 文件时,我收到错误:
java.util.zip.ZipException: duplicate entry: MyApp-1.cod
(编辑后的构建输出中的完整错误详情)
我可以看到这是 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>
解决方法
Esaj 有一个good answer below,它在编译之前在源代码上运行 Ant replace 任务。这意味着无需对任何生成的 JAR 文件运行 jarjar 来解决命名空间问题。
这对我有用,因为我有 SDK 源代码。它不适用于我的客户,因为我以 JAR 格式分发我的 SDK。所以我仍然希望得到这个问题的答案。
相关
此与 [How to convert JAR FILE to COD file using Ant Build] 重复,但该问题尚未得到解答,我已添加更多详细信息。
这不是重复的:
- [Convert a .jar file into a .cod file using bb-ant] - 我使用了接受的答案,但我的错误是不同的。
- [BlackBerry - Ant script to include JAR in project without external dependancies] - 这个问题是关于将库作为 JAR 添加而不是像上面那样使用源代码。在某种程度上,这是一个前导步骤,因为它的输出仍然需要通过 jarjar 运行。
【问题讨论】:
-
你是用
srcdir来表示包含jar的文件夹吗? -
如果是这样,请尝试改用
src和fileset。 -
我已经按照建议使用了
src和fileset。
标签: blackberry ant