当然,您仍然需要使用 sigtool 对 COD 进行签名.我在 ANT 中完成所有这些工作.我使用不同的文件夹来存储每个步骤的输出.通过这种方式,我最终得到了 5 个临时文件夹,但这样可以轻松调试这些步骤.我现在终于明白为什么很少有人能够为我的各种 BB ANT 构建脚本问题提供确凿的答案.这个过程很费力,很长,很难解释.完成此任务的完整 ANT 构建框架可以跨越许多不同的文件(在我的情况下,我想我现在使用 8 个,包括属性文件).并且它需要良好的 ANT、普通 Java 构建工具和 RIM 的 rapc 命令的工作知识.我想我已经在我的问题中很好地记录了流程的每个步骤,并在此过程中得到了一些很好的答案.有关更多详细信息,请查看其他问题 &答案.每个都包含有用的链接,以及来自该社区其他开发者的一些很好的见解How do I use Ant (bb-ant-tools) to compile a JAR file into a COD? i.e. with no other source filesReasonUltimately, I need a script that is going to run Jar Jar Links (jarjar) during the build, to get around the namespace issues of using our sdk in multiple apps. Jarjar takes a JAR file as input, and I presume it outputs a JAR file.So to run jarjar in a bb-ant-tools build, I need to know how to compile that output JAR into a COD.I am focusing on just this part of the issue to minimise other possible sources of error. I will attempt the jarjar step once I can master building a JAR into a COD.Progress1) I can build my project into a working COD, sign and run on device.2) To include the sdk code, I currently add the source folders to the main project build. (In the future I would like to know how to include the library into the build as a JAR - BlackBerry - Ant script to include JAR in project without external dependancies)3) Output of this step includes the usual files:MyApp.cod (if I sign this, it runs perfectly on device)MyApp.cslMyApp.csoMyApp.debugMyApp.jadMyApp.jar (I want to run jarjar on this)MyApp.rapc4) I tried to run a 2nd build, taking the above JAR file and using it as the only source file in the rapc call. I do this by pointing the src tag of rapc at a folder containing only my JAR file.In the final part of the build, when rapc is adding the files, I get the error: java.util.zip.ZipException: duplicate entry: MyApp-1.cod(full details of error below in edited build output)I can see that this is the 2nd time that rapc tries to add this file. I do not understand why, since there is only one copy of that file in the JAR.Build Output (edited with ...etc to make it readable )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 FAILEDC:\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 secondsC:\development\ant\new_test\MyApp>WorkaroundEsaj has a good answer below that runs the Ant replace task on the source code before doing the compile. This means that there is no need to run jarjar on any resulting JAR file to solve the namespace problems.This will work for me, as I have the SDK source code. It will not work for my clients, because I distribute my SDK in JAR format. So I'm still hoping for an answer to this question as it stands.RelatedThis is a duplicate of [ How to convert JAR FILE to COD file using Ant Build ] but that question has not been answered, and I have added more detail.This is not a duplicate of:[ Convert a .jar file into a .cod file using bb-ant ] - I have used the accepted answer, and my error is different.[ BlackBerry - Ant script to include JAR in project without external dependancies ] - this question is about adding the library in as a JAR instead of using the source code as I do above. In a way, it is a precursor step, as its output would still need to be run through jarjar. 解决方案 To answer my own question with some details...One must not call rapc multiple times - it will create too many COD files. That is why I was getting that error.Following up from Michael's answer, the correct way to proceed is to build the final JAR file using the normal java tools (javac & jar) as well as RIM's preverify command.Only use rapc for the last step - converting that JAR file into a COD.A full ANT build framework to deal with this problem is too big to place here, but the steps needed to create it are listed below. Each of the steps can be easily researched on this site (or with some google). Each step is very simple, and can be debugged individually.Steps:javac the SDK to create CLASS filespreverify the CLASS filesjar the SDKCopy the SDK JAR file into the projectjavac the project - use the SDK JAR as the classpathpreverify the project CLASS files (again, use the SDK JAR in the classpath)jar the project - add the SDK JAR as a zipfilesetjarjar this project JAR to refactor package names as requiredFinally, run rapc on this JAR - it will find no duplicate COD files & should run fine.Note: Steps 1-3 can be combined by just using rapc on the SDK (which is needed if you need to run preprocessor tags on the SDK code).By breaking it down into simple steps like this, I learnt how the normal java tools link into RIM's toolchain (normally this is all hidden when you simply invoke rapc on a source folder).Of course, you still need to sign the COD with the sigtool.I do all of this in ANT. I use a different folder to store the output from each step as I go. This way I end up with 5 temp folders at the end, but it made it easy to debug the steps as I go.I finally understand now why so few people were able to offer conclusive answers to my various BB ANT build script questions. The process is laborious and very long, and hard to explain.A full ANT build framework to accomplish this can stretch over many different files (in my case I think I'm now using 8 including property files). And it requires a good working knowledge of ANT, normal java build tools, and RIM's rapc command.I think I have documented each step of the process quite well in my questions about this, and picked up some great answers along the line. For more details, have a look at those other questions & answers. Each one contains useful links, and some good insight from the other developers in this community 这篇关于BlackBerry:在 Ant 脚本中从 JAR 源文件创建 COD的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 上岸,阿里云!
08-24 18:11