5

Ant( bb-ant-tools)を使用してJARファイルをCODにコンパイルするにはどうすればよいですか?つまり、他のソースファイルはありません


理由

最終的に、複数のアプリでSDKを使用する際の名前空間の問題を回避するために、ビルド中にJar Jar Links(jarjar)を実行するスクリプトが必要です。JarjarはJARファイルを入力として受け取り、JARファイルを出力すると思います。

したがって、bb-ant-toolsビルドでjarjarを実行するには、その出力JARをCODにコンパイルする方法を知る必要があります。

他の考えられるエラーの原因を最小限に抑えるために、問題のこの部分だけに焦点を当てています。JARをCODに組み込む方法をマスターできたら、jarjarステップを試行します。

進捗

1)プロジェクトを機能するCODに組み込み、署名してデバイス上で実行できます。

2)sdkコードを含めるために、現在、メインプロジェクトビルドにソースフォルダーを追加しています。(将来的には、ライブラリをJARとしてビルドに含める方法を知りたいです-BlackBerry-外部の依存関係なしにプロジェクトにJARを含めるためのAntスクリプト

3)このステップの出力には、通常のファイルが含まれます。

  • MyApp.cod(これに署名すると、デバイス上で完全に実行されます)
  • MyApp.csl
  • MyApp.cso
  • MyApp.debug
  • MyApp.jad
  • MyApp.jar(これでjarjarを実行したい)
  • MyApp.rapc

4)上記のJARファイルをrapc呼び出しの唯一のソースファイルとして使用して、2番目のビルドを実行しようとしました。これを行うには、JARファイルのみを含むフォルダーにのsrcタグを指定します。rapc

ビルドの最後の部分で、rapcがaddingファイルの場合、次のエラーが発生します。

 java.util.zip.ZipException: duplicate entry: MyApp-1.cod

(編集されたビルド出力の以下のエラーの完全な詳細)

rapcがこのファイルを追加しようとするのはこれが2回目であることがわかります。JARにはそのファイルのコピーが1つしかないため、理由がわかりません。


ビルド出力(...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タスクを実行するという良い答えがあります。これは、名前空間の問題を解決するために、結果のJARファイルでreplace実行する必要がないことを意味します。jarjar

SDKのソースコードがあるので、これでうまくいきます。SDKをJAR形式で配布しているため、クライアントでは機能しません。ですから、私はまだこの質問に対する答えを期待しています。


関連している

これ[ AntBuildを使用してJARファイルをCODファイルに変換する方法]の複製ですが、その質問には回答されていないため、詳細を追加しました。

これは次の複製ではありません。

4

3 に答える 3

2

この回答をBlackBerry - Ant スクリプトからコピーして、@RichardLeMesurier の要求に従って、外部依存関係なしでプロジェクトに JAR を含める:

昨年も同様の問題がありました。複数のBBアプリケーションのベースとして使用される「フレームワーク」を作成しましたが、複数のCODで問題が発生しました(正確には覚えていません。デバイスのようなものはインストールを拒否しました外部 COD が最初に個別にインストールされていない場合は、同じ外部 CoD を持つ複数のアプリケーション、次にアプリケーション)。アプリケーションは個別にインストールできるため (ある人はアプリ A のみをインストールし、別の人はアプリ B のみをインストールし、別の人は A と B の両方をインストールする可能性があります)、フレームワーク全体をそれを使用するすべてのアプリに含める必要がありました。私は bb-ant-tools を使用してこの 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 を使用してターゲットのビルド ディレクトリにビルドされます。アプリの署名、クリーニング、およびシミュレーターへのロードには、個別のタスクがあります。お役に立てれば。

于 2012-05-21T07:12:05.697 に答える
0

コンソール出力から、失敗しているコマンド:

jar -cfmv C:\ development \ ant \ new_test \ MyApp \ build \ MyApp.jar C:\ Users \ Richard \ AppData \ Local \ Temp \ rapc_598c0c5a.dir \ META-INF \ MANIFEST.MFMyApp.codMyApp-1。 cod MyApp-2.cod MyApp.csl MyApp.cso -CC:\ Users \ Richard \ AppData \ Local \ Temp\rapc_598c2ad7.dir。

jarツールのドキュメントでこれらのオプションを検索します。

-C dir
次のinputfiles引数の処理中に、jarコマンドの実行中にディレクトリ(cd dir)を一時的に変更します。その操作は、UNIXtarユーティリティの-Cオプションと同様にすることを目的としています。

これに基づいて、rapcは解凍されたcodファイルをC:\ Users \ Richard \ AppData \ Local \ Temp \ rapc_598c2ad7.dirに配置しているため、コマンドラインで指定されたcodファイルとの競合が発生していると思います。そのディレクトリはまだありますか?中を見て、そこに何があるかを確認してください。

于 2012-05-19T17:05:15.587 に答える
0

いくつかの詳細で私自身の質問に答えるには...

複数回呼び出してはなりませんrapc。あまりにも多くの COD ファイルが作成されます。そのため、そのエラーが発生していました。

Michael's answerからフォローアップする正しい方法は、通常の Java ツール (javac & jar) と RIM のpreverifyコマンドを使用して最終的な JAR ファイルを作成することです。

rapc最後のステップ (JAR ファイルを COD に変換する) にのみ使用します。

この問題に対処するための完全な ANT ビルド フレームワークは大きすぎてここに配置できませんが、作成に必要な手順を以下に示します。各ステップは、このサイト (またはいくつかの Google) で簡単に調査できます。各ステップは非常に単純で、個別にデバッグできます。

手順:

  1. javacCLASS ファイルを作成するための SDK
  2. preverifyクラスファイル
  3. jarSDK
  4. SDK JAR ファイルをプロジェクトにコピーします。
  5. javacプロジェクト - SDK JAR をクラスパスとして使用します
  6. preverifyプロジェクトの CLASS ファイル (ここでも、クラスパスで SDK JAR を使用します)
  7. jarプロジェクト - SDK JAR をzipfilesetとして追加します
  8. jarjar必要に応じてパッケージ名をリファクタリングするためのこのプロジェクト JAR
  9. 最後に、rapcこの JAR で実行します。重複する COD ファイルは検出されず、正常に実行されるはずです。

: 手順 1 ~ 3 は、SDK で使用するだけで組み合わせることができrapcます (これは、SDK コードでプリプロセッサ タグを実行する必要がある場合に必要です)。

このように簡単な手順に分解することで、通常の Java ツールが RIM のツールチェーンにリンクする方法を学びました (通常rapc、ソース フォルダーで単純に呼び出すと、これはすべて非表示になります)。

もちろん、引き続き COD に署名する必要がありますsigtool

これらはすべて ANT で行います。各ステップの出力を保存するために、別のフォルダーを使用します。このようにして、最後に 5 つの一時フォルダーができてしまいますが、手順のデバッグが容易になりました。


BB ANT ビルド スクリプトのさまざまな質問に対して、決定的な回答を提供できる人がほとんどいない理由がようやくわかりました。このプロセスは面倒で非常に長く、説明するのが困難です。

これを達成するための完全な ANT ビルド フレームワークは、多くの異なるファイルに拡張できます (私の場合、プロパティ ファイルを含めて 8 つを使用していると思います)。rapcまた、ANT、通常の Java ビルド ツール、および RIM のコマンドに関する実用的な知識が必要です。

これに関する私の質問では、プロセスの各ステップを非常によく文書化し、その過程でいくつかの素晴らしい答えを見つけたと思います. 詳細については、他の質問と回答をご覧ください。それぞれに役立つリンクと、このコミュニティの他の開発者からの有益な洞察が含まれています。

于 2012-05-29T09:21:10.593 に答える