【问题标题】:BlackBerry - Ant script to include JAR in project without external dependanciesBlackBerry - 将 JAR 包含在项目中的 Ant 脚本,无需外部依赖
【发布时间】:2012-05-14 11:30:22
【问题描述】:

这是对BlackBerry - use own JAR file in own projectBlackBerry - Ant build script for more complex apps 的跟进。这个问题现在已经solved below了。

目标

我想:

  1. 使用 Ant (bb-ant-tools) 将我的库构建到 JAR 文件中
  2. 在项目中包含该 JAR 文件
  3. 使用 Ant 将该项目构建为可在设备上运行的 COD(无需外部 COD 文件)。

重要的部分是使用 Ant 完成构建的最后阶段

我发现的所有关于这个问题的帖子都使用 Eclipse 进行最后的构建阶段(详情参见BlackBerry - use own JAR file in own project)。


进展

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

问题

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

我阅读的许多帖子都显示了如何使用库的额外 COD 文件来完成此操作。我想避免这种情况。

如何使用 Ant 将 JAR 包含到我的项目中而不需要外部依赖项?我相信这是可能的,因为我可以使用 Eclipse 来做到这一点。


解决方法

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


(我希望可以通过以下一长串链接来交叉引用这个问题?)

StackOverflow 链接:

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

这些没那么有用:

轮辋:

【问题讨论】:

  • 在 Eclipse 插件中手动执行此操作时,在 Java 构建路径中 -> 最后一个选项卡称为“订购和导出”。如果启用对库的检查,它会将类文件导出到 cod。
  • @mistersmith:谢谢,如果有人想了解有关该方法的更多详细信息,我已在此答案中全面介绍:BlackBerry - use own JAR file in own project

标签: blackberry ant


【解决方案1】:

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

例如:

<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>

【讨论】:

  • 似乎运行 - 在应用程序初始化之前发现 NullPointerException 被抛出(代码问题)......也许这就是我认为这种方法不起作用的原因......在调查后会添加更多内容。奇怪的是,在构建将库代码添加为源代码的应用程序时,不会抛出 NullPointerException。这里出现了一些不同的东西......
  • 以前的开发人员已将一些资源文件放入&lt;src&gt; 文件夹中。正如上面的答案所写的,这些没有包含在脚本中。我已经用我的修复更新了答案,以防它赶上其他人(毕竟这是一个赏金问题)。
【解决方案2】:

去年我遇到了类似的问题,我创建了一个“框架”,用作多个 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 构建到目标构建目录。对应用程序进行签名、清理和加载到模拟器有不同的任务。希望这会有所帮助。

【讨论】:

  • 所以这本质上是在源代码级别进行 SDK/框架重构?我理解正确吗?
  • @RichardLeMesurier:是的,库被复制为源文件,然后与使用它的应用程序一起构建。我确实了解您正在寻找一种解决方案,其中 Ant-build 从您的库中编译一个单独的 jar,但这应该可以工作,除非该库绝对有必要位于单独的 jar/cod 中。您仍然可以使用原始包编写应用程序代码,并将库和应用程序保持为单独的项目,如果您没有多个应用程序使用该库,则不需要重命名包步骤。
  • 这是一个非常有用的答案,它解决了很多问题(尽管不完全适合这个问题)。我认为将它复制到我的另一个问题BlackBerry: create COD from JAR source file in Ant script 将非常有用。如果你不想复制它,我会在一周左右完成。
  • @RichardLeMesurier:没问题,我复制过来。
猜你喜欢
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多