如何使用Ant(bb Ant工具)将JAR文件编译成COD?i、 e.没有其他源文件
最终,我需要一个在构建过程中运行Jar-Jar链接(jarjar)的脚本,以解决在多个应用程序中使用sdk的名称空间问题。Jarjar接受一个JAR文件作为输入,我认为它输出一个JAR文件。
因此,要在bb-ant-ool构建中运行jarjar,我需要知道如何将输出JAR编译成COD。
我只关注问题的这一部分,以尽量减少其他可能的错误来源。一旦我能熟练地将罐子制作成鳕鱼,我将尝试jarjar步骤。
1) 我可以将我的项目构建成一个工作的COD,在设备上签名并运行。
2) 为了包含sdk代码,我目前将源文件夹添加到主项目构建中。(将来我想知道如何将库作为JAR-BlackBerry-Ant脚本包含到构建中,以便在项目中包含JAR而不依赖外部)
3) 此步骤的输出包括常用文件:
4)我试图运行第二个构建,使用上面的JAR文件,并将其作为rapc
调用中唯一的源文件。我通过将rapc
的src
标记指向一个只包含我的JAR文件的文件夹来做到这一点。
在构建的最后一部分,当rapc添加文件时,我得到错误:
java.util.zip.ZipException: duplicate entry: MyApp-1.cod
(以下编辑生成输出中错误的完整详细信息)
我可以看到,这是rapc第二次尝试添加此文件。我不明白为什么,因为JAR中只有该文件的一个副本。
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在下面有一个很好的答案,在编译之前在源代码上运行蚂蚁替换
任务。这意味着不需要在任何产生的JAR文件上运行jarjar
来解决命名空间问题。
这将为我工作,因为我有SDK源代码。它对我的客户不起作用,因为我以JAR格式分发我的SDK。所以我仍然希望这个问题的答案。
这是[如何使用Ant Build将JAR文件转换为COD文件]的副本,但这个问题还没有得到回答,我已经添加了更多细节。
这不是以下内容的副本:
用一些细节来回答我自己的问题。。。
不能多次调用rapc
-它会创建太多的COD文件。这就是为什么我得到了那个错误。
从迈克尔的回答开始,正确的方法是使用普通的java工具(javac
最后一步只使用rapc
——将JAR文件转换为COD。
处理此问题的完整ANT构建框架太大,无法放在这里,但创建它所需的步骤如下所示。每个步骤都可以在这个网站上轻松地进行研究(或者使用谷歌)。每个步骤都非常简单,可以单独调试。
步骤:
javac
创建类文件的SDK注意:步骤1-3可以通过在SDK上使用rapc
来组合(如果您需要在SDK代码上运行预处理器标记,则需要使用该代码)。
通过将其分解为这样的简单步骤,我了解了普通java工具如何链接到RIM的工具链(通常,当您在源文件夹上调用rapc
时,这一切都是隐藏的)。
当然,您仍然需要使用sigtool
在COD上签名。
我做所有这些在ANT。我使用不同的文件夹来存储每一步的输出。这样,我最后得到了5个临时文件夹,但它使调试步骤变得容易。
我现在终于明白了为什么这么少的人能够对我的各种BB ANT构建脚本问题提供结论性的答案。这个过程既费力又漫长,很难解释。
一个完整的ANT构建框架可以覆盖许多不同的文件(在我的例子中,我想我现在使用的是8个文件,包括属性文件)。它需要对ANT、普通java构建工具和RIM的rapc
命令有很好的了解。
我想我已经在关于这个问题的提问中很好地记录了这个过程的每一步,并从中得到了一些很好的答案。有关更多详细信息,请查看其他问题
从控制台输出,失败的命令:
jar-cfmv C:\development\ant\new\u test\MyApp\build\MyApp。jar C:\Users\Richard\AppData\Local\Temp\rapc\u 598c0c5a。dir\META-INF\MANIFEST。mfmyapp。鳕鱼MyApp-1。鳕鱼MyApp-2。codmyapp。csl MyApp。cso-C:\Users\Richard\AppData\Local\Temp\rapc\u 598c2ad7。迪尔。
在jar工具留档中查找这些选项:
-C dir
在处理以下inputfiles参数时,在执行jar命令期间临时更改目录(cd dir)。它的操作与UNIX tar实用程序的-C选项类似。
基于此,我认为rapc将未打包的cod文件放在C:\Users\Richard\AppData\Local\Temp\rapc598c2ad7中。这会导致与命令行上指定的cod文件发生冲突。那个目录还在吗?看看里面有什么。
根据@RichardLeMesurier的请求,从BlackBerry-Ant脚本复制此答案,以将JAR包含在项目中,而无外部依赖性:
去年我也遇到了类似的问题,我创建了一个框架,用作多个BB-应用程序的基础,但遇到了多个COD的问题(我不记得具体是什么了,比如设备拒绝安装具有相同外部功能的多个应用程序如果外部COD没有首先单独安装,然后是应用程序)。由于应用程序可以单独安装(一个人可能只安装应用程序A,另一个人可能只安装应用程序B,还有一个人可能同时安装应用程序A和应用程序B),整个框架需要包含在使用它的所有应用程序中。我制作了这个蚂蚁脚本使用BB-ANT-工具(希望我没有打破任何东西删除一些特定于我们的应用程序和混淆包名称等):
<?xml version="1.0" encoding="UTF-8"?>
<project name="${description}" default="build" basedir=".">
<taskdef resource="bb-ant-defs.xml" classpath="lib/bb-ant-tools.jar" />
<!-- rapc and sigtool require the jde.home property to be set -->
<!-- NOTE: You may need to copy the signature files from Eclipse\plugins\net.rim.ejde\vmTools to the components\bin -dir
if the keys were installed using the Eclipse-plugin -->
<property name="jdehome" value="C:\BB\Eclipse\plugins\net.rim.ejde.componentpack5.0.0_5.0.0.25\components" />
<!-- Framework source locations, these must be set correctly -->
<property name="frameworkRes.dir" value="C:\BB\workspace\BB_Framework\res" />
<property name="frameworkSrc.dir" value="C:\BB\workspace\BB_Framework\src\com\whatever\frame" />
<!-- Locations for simulator, binaries, jde home, don't touch these -->
<property name="simulator" value="${jdehome}\simulator" />
<property name="bin" value="${jdehome}\bin" />
<property name="jde.home" location="${jdehome}" />
<!-- directory of simulator to copy files to -->
<property name="simulator.home" location="${simulator}" />
<property name="src.dir" location="src" />
<property name="build.dir" location="build" />
<property name="temp.dir" location="C:\tempsrc" />
<!-- Project specific -->
<!-- Application title -->
<property name="app.title" value="Application Name" />
<property name="app.version" value="1.0.0" />
<!-- Value to prepend before frame-class packages -->
<property name="frame.prefix" value="appname" />
<!-- Name of the COD to produce -->
<property name="cod.name" value="Appname" />
<target name="build">
<mkdir dir="${build.dir}" />
<delete dir="${temp.dir}" />
<mkdir dir="${temp.dir}" />
<mkdir dir="${temp.dir}\${frame.prefix}" />
<copy toDir="${temp.dir}">
<fileset dir="${src.dir}">
<include name="**/*.java" />
</fileset>
</copy>
<copy toDir="${temp.dir}\${frame.prefix}">
<fileset dir="${frameworkSrc.dir}">
<include name="**/*.java" />
</fileset>
</copy>
<copy toDir="${temp.dir}\res">
<fileset dir="${frameworkRes.dir}">
<include name="**/*" />
</fileset>
</copy>
<copy toDir="${temp.dir}\res">
<fileset dir="res">
<include name="**/*" />
</fileset>
</copy>
<!-- This replaces the package names for classes copied from under
framework-directory to ${frame.prefix} -directory as well as changing any
imports using the classes in framework-package -->
<replace dir="${temp.dir}" value="${frame.prefix}">
<include name="**/*.java"/>
<replacetoken>com.whatever.frame</replacetoken>
</replace>
<rapc output="${cod.name}" srcdir="${temp.dir}" destdir="${build.dir}">
<jdp title="${app.title}"
version="${app.version}"
vendor="Your Company"
icon="../res/img/icon.png"
/>
</rapc>
</target>
<target name="sign">
<sigtool codfile="${build.dir}/${cod.name}.cod" />
</target>
<target name="clean">
<delete dir="${build.dir}" />
</target>
<target name="load-simulator" depends="build">
<copy todir="${simulator.home}">
<fileset dir="${build.dir}" includes="*.cod,*.cso,*.debug,*.jad,*.jar" />
</copy>
</target>
</project>
这样做的目的是将所有java文件和资源从当前项目复制到临时目录,然后从框架项目复制到临时目录,同时替换框架文件的包名(因为它们被放在单独命名的目录中),这与以下事实有关:设备还拒绝安装在相同包下具有相同类的多个应用程序(即,框架类,对于您的情况,这可能不是必需的)。复制和替换完成后,使用rapc将应用程序构建到目标构建目录。有单独的任务用于签名、清理和将应用程序加载到模拟器。希望这有帮助。
可以从jar文件中运行ant脚本吗? 目前,我有一个build.xml,它调用一些java代码,这些代码在一个jar文件中。然后它做一些进一步的蚂蚁处理。 当我从Eclipse导出jar文件时,我可以选择添加构建。xml文件到jar,所以我想知道我是否可以直接从jar运行ant脚本,这样我只需要给人们jar文件,而不是ant脚本。
我在Eclipse中有一个简单的maven项目。应用程序包含文件:src/main/Resources/test.txt.我想读取文件并将其写入输出。它在Eclipse中工作,但在创建jar文件后不能从命令行。如何配置项目以两种方式工作。我错在哪里?不正确的jar文件、java代码、清单、maven配置? 应用程序结构: 应用程序结构 运行: 错误: Java代码: pom.xml: fileRe
问题内容: 我需要从Windows计算机上运行的ANT脚本创建RPM软件包。此程序包必须包含构建的结果类以及其他一些其他资源。 我猜应该在某个地方可以从命令行调用一些程序来创建此程序包。 我之所以要在Windows下执行此操作,是因为我们有一个脚本可以为几个不同的平台构建安装程序,并且所有内容都已为Windows配置,因此我想避免将所有内容迁移到Linux的麻烦。 您知道如何实现吗? 编辑:我已经
我已经成功地在svn中检入的java项目的根目录下添加了build.xml。 现在,下面是jenkin构建的控制台输出 复制 /var/lib/jenkins/workspace/FinalWar/WebContent/WEB-INF/WEB。xml转换为 /var/lib/jenkins/workspace/FinalWar/build/WebContent/WEB-INF/WEB。xml 文件
问题内容: 我是Scala的新手,也不了解Java。我想从一个简单的Scala文件中创建一个jar文件。所以我有了我的HelloWorld.scala,生成了一个HelloWorld.jar。 Manifest.mf: 在控制台中,我运行: 问题答案: 示例目录结构: HelloWorld.scala: MANIFEST.MF: build.bat: 为了成功使用 -jar 开关,您需要在 MET
HTSJDK是一个用于访问常见文件格式(如SAM和VCF)的库。我想构建HTSJDK JAR。在文档页面中说我必须为此使用Ant。所以我安装了Ant并运行以下命令: ant htsjdk-jar [javac]用法:javac [javac]use-help获取可能选项列表 生成失败 build.xml文件有问题。这里是文件的开头: 拜托,有人能告诉我该怎么做才能解决这个问题吗?