如何使用 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(如果我签名,它会在设备上完美运行)
- 我的应用程序.csl
- 我的应用程序.cso
- MyApp.debug
- 我的应用程序.jad
- MyApp.jar(我想在这个上运行 jarjar)
- 我的应用程序.rapc
4) 我尝试运行第二次构建,采用上述 JAR 文件并将其用作rapc
调用中的唯一源文件。我通过将src
标签指向rapc
仅包含我的 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在下面有一个很好的答案,replace
即在进行编译之前在源代码上运行 Ant任务。这意味着不需要运行jarjar
任何生成的 JAR 文件来解决命名空间问题。
这对我有用,因为我有 SDK 源代码。它不适用于我的客户,因为我以 JAR 格式分发我的 SDK。所以我仍然希望得到这个问题的答案。
有关的
这是[如何使用 Ant Build 将 JAR 文件转换为 COD 文件]的副本,但该问题尚未得到解答,我添加了更多细节。
这不是以下内容的重复:
- [使用 bb-ant 将 .jar 文件转换为 .cod 文件] - 我使用了公认的答案,但我的错误是不同的。
- [ BlackBerry - Ant script to include JAR in project without external dependencies ] - 这个问题是关于将库作为 JAR 添加而不是像上面那样使用源代码。在某种程度上,这是一个前导步骤,因为它的输出仍然需要通过 jarjar 运行。