BlackBerry - Ant脚本,用于在没有外部依赖项的项目中包含JAR

时间:2012-05-14 11:30:22

标签: blackberry ant

这是后续行动:BlackBerry - use own JAR file in own project& BlackBerry - Ant build script for more complex apps。这个问题现在已经solved below

目标

我想:

  1. 使用Ant(bb-ant-tools)将我的库构建为JAR文件
  2. 在项目中包含该JAR文件
  3. 使用Ant 将该项目构建到将在设备上运行的COD(无外部COD文件)。
  4. 重要的是使用Ant来完成构建的最后阶段

    我找到的针对此问题的所有帖子都使用Eclipse进行最终构建阶段(详见BlackBerry - use own JAR file in own project)。


    进度

    1. 我可以使用Ant。
    2. 将库项目构建到JAR中
    3. 在Eclipse中,我可以将JAR文件添加到项目中,并根据需要构建它(单个COD,没有外部依赖项)。它将在设备上运行。
    4. 在Ant中,我还可以创建一个依赖于额外COD库来包含运行时代码的构建 - 这接近我所需要的。
    5. 问题

      我可以使用Ant构建最终项目。但是生成的COD文件不包含我的库中的任何运行时代码

      我读过的很多帖子都展示了如何使用库的额外COD文件来完成这项工作。我想避免这种情况。

      如何在没有外部依赖关系的情况下将JAR包含到我的项目中?使用Ant?我相信这是可能的,因为我可以使用Eclipse来实现。


      解决方法

      我目前的解决方法是将我的SDK /库项目包含为源代码(as per esaj's answer below),而不是作为JAR文件。这比JAR方法有一些缺点,但我有一个在设备上成功运行的构建。


      (我希望可以将这个问题与以下长链接列表交叉引用?)

      StackOverflow链接:

      这个提供了其他链接 - 非常有用:

      这些不太有用:

      RIM:

2 个答案:

答案 0 :(得分:4)

您是否尝试过指向rapc下src部分的库?

E.g:

<rapc ...>
  <src>
    <fileset dir="${buildDirectory}">
      <include name="src/**/*.rrh" />
      <include name="src/**/*.rrc" />
      <include name="src/**/*.java" />
      <include name="res/**/*.*" />
      <!-- Libraries -->
      <include name="lib/**/*.*" />
    </fileset>
  </src>
</rapc>

答案 1 :(得分:1)

去年我遇到了类似的问题,我创建了一个“框架”,用作多个BB应用程序的基础,但遇到了多个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 -->    
        <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定位构建目录。签名,清理和将应用程序加载到模拟器有单独的任务。希望这会有所帮助。