黑莓手机:从Ant脚本JAR源文件创建COD(BlackBerry: create COD from

2019-06-24 12:47发布

我如何使用Ant( BB-Ant的工具 )来编译JAR文件到COD? 即没有其他的源文件


原因

最后,我需要的是要运行脚本瓶瓶链接(jarjar)的构建过程中,避开在多个应用程序使用我们的SDK的命名空间的问题。 Jarjar需要一个JAR文件作为输入,并且我相信它输出一个JAR文件。

因此,要在BB-Ant的工具运行jarjar构建,我需要知道如何编译输出JAR成COD。

我专注于这个问题的这一部分来减少错误的其他可能的来源。 我会尝试一次,我可以掌握建设JAR成COD的jarjar一步。

进展

1)我可以建立我的项目到工作的COD,标志和设备上运行。

2)要包括SDK代码,我目前的源文件夹添加到主体工程建设。 (在未来,我想知道如何包含库到构建一个JAR - 黑莓- 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

(在编辑生成输出误差的全部细节如下)

我可以看到,这是RAPC尝试添加此文件中的第2次 。 我不明白为什么,因为只有一个在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有如下很好的答案运行Ant的replace做编译前的源代码的任务。 这意味着,没有必要运行jarjar对由此产生的任何JAR文件来解决命名空间问题。

这会为我工作,因为我有SDK源代码。 它不会为我的客户工作,因为我在JAR格式分发我的SDK。 所以我仍然希望回答这个问题,因为它主张。


有关

[ 复制 如何使用Ant生成JAR文件转换为COD文件 ],但是这个问题一直没有得到答复,我也增加了更多的细节。

不是一个重复:

  • [ 使用BB-蚂蚁转换.jar文件到.cod文件 ] -我已经使用了公认的答案,我的错误是不同的。
  • [ 黑莓- Ant脚本包括在项目JAR没有外部依赖关系 ] -这个问题是关于在添加库作为JAR而不是使用源代码作为我上面做。 在某种程度上,这是一个先导步骤,作为它的输出仍然需要通过jarjar运行。

Answer 1:

从复制这个答案黑莓- Ant脚本,包括在项目JAR没有外部的依赖关系为每@ RichardLeMesurier的要求:

去年我有过类似的问题,我已经创建了一个被用作多个BB-应用程序的基础一个“框架”,但碰上多的差值相的问题(我不记得确切的东西,有点像设备拒绝安装该具有相同的外部鳕鱼,如果外部的差值相未安装单独第一多个应用程序,然后将该应用程序)。 由于应用程序可以单独安装(一个人可能只安装应用程序A,另一个可能只安装应用程序B,和另一个可能会安装A和B),需要使用它包含在所有的应用程序整个框架。 我用BB-ANT-工具(希望我没有破坏任何东西去掉一些具体到我们的应用程序的东西,混淆包名等)炮制此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目标构建目录。 有签署,清洗和加载应用模拟器不同的任务。 希望这可以帮助。



Answer 2:

从您的控制台输出,发生故障的命令:

罐子-cfmv C:\研发\蚂蚁\ new_test \ MyApp的\建设\ MyApp.jar C:\用户\理查德\应用程序数据\本地的\ Temp \ rapc_598c0c5a.dir \ META-INF \ MANIFEST.MF MyApp.cod MyApp的-1。鳕鱼MyApp的-2.cod MyApp.csl MyApp.cso -CC:\用户\理查德\应用程序数据\本地的\ Temp \ rapc_598c2ad7.dir。

仰望这些选项的jar工具的文档 :

-C DIR
jar命令的执行期间,临时改变目录(CD DIR)处理下列inputfiles参数。 它的操作旨在类似于UNIX tar实用程序的-c选项。

在此基础上,我认为RAPC是把解压后的COD文件在C:\用户\理查德\应用程序数据\本地的\ Temp \ rapc_598c2ad7.dir并导致与命令行上指定的cod文件冲突。 是目录还在吗? 往里看那里的东西。



Answer 3:

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

一个不能调用rapc多次-这将创造太多的COD文件。 这就是为什么我得到这个错误。

从随访迈克尔的回答 ,进行正确的方法是建立使用普通的Java工具(javac的&JAR)以及RIM的最终JAR文件preverify命令。

仅使用rapc的最后一步-该JAR文件转换成COD。

一个完整的ANT构建框架来处理这个问题太大了,放在这里,而是创造它所需的步骤如下。 每个步骤可以在这个网站(或与一些谷歌)可以容易地研究。 每一步都是非常简单的,并且可以单独进行调试。

步骤

  1. javac SDK来创建CLASS文件
  2. preverify的类文件
  3. jar的SDK
  4. 该SDK JAR文件复制到项目
  5. javac项目-使用SDK JAR的类路径
  6. preverify项目CLASS文件(再次,使用在classpath中SDK JAR)
  7. jar项目-添加SDK JAR作为zipfileset
  8. jarjar要求这个项目JAR重构包名
  9. 最后,运行rapc这个JAR -它会发现没有重复的COD文件及应运行正常。

:步骤1-3可以通过只使用相结合rapc的SDK(如果您需要在SDK代码运行预处理器标签这是需要)上。

通过将它分解为像这样简单的步骤,我学到了普通的Java工具是如何链接到RIM的工具链(通常这是所有隐藏的,当你简单地调用rapc上的源文件夹)。

当然,你还需要与签署COD sigtool

我做这一切的ANT。 我用不同的文件夹到输出存储从每一步,我去。 这样,我结束了在5个月底临时文件夹,但它使人们易于调试的步骤,我去。


我现在终于明白为什么那么少人能提供确凿的答案,我的各种BB Ant构建脚本的问题。 这个过程是艰苦的很长,而且很难解释。

一个完整的ANT构建框架来实现这一点可以跨越多个不同的文件(在我的情况,我认为现在我使用的8包括物业文件)。 它需要ANT,普通的Java构建工具,和RIM的一个良好的工作知识rapc命令。

我想我已经在我的关于这个问题,记录的过程的每个步骤相当好,拿起沿线一些伟大的答案。 欲了解更多详情,看看那些其他问题与解答。 每一个包含在这个社会有用的链接,并从其他开发商一些很好的启示



文章来源: BlackBerry: create COD from JAR source file in Ant script