黑莓 - 在自己的项目中使用自己的JAR文件和黑莓 - Ant构建脚本用于更复杂的应用程序的后续。这个问题现在已经在下面解决了。
目的
我想:
- 使用 Ant(bb-ant-tools(将我的库构建为 JAR 文件
- 将该 JAR 文件包含在项目中
- 使用 Ant 将该项目构建到将在设备上运行的 COD 中(无需外部 COD 文件(。
重要的部分是使用 Ant 来完成构建的最后阶段。
我找到的所有关于这个问题的帖子都使用Eclipse进行最终构建阶段(黑莓的详细信息 - 在自己的项目中使用自己的JAR文件(。
进展
- 我可以使用 Ant 将库项目构建为 JAR。
- 在 Eclipse 中,我可以将该 JAR 文件添加到项目中,并根据需要构建它(单个 COD,无外部依赖关系(。它将在设备上运行。
- 在 Ant 中,我还可以制作一个依赖于额外的 COD 库来包含运行时代码的构建 - 这接近我的需求。
问题
我可以用 Ant 构建最终项目。但是生成的 COD 文件不包含我的库中的任何运行时代码。
我读过的许多帖子都展示了如何使用库的额外 COD 文件来完成此操作。我想避免这种情况。
如何使用 Ant 将 JAR 包含在没有外部依赖项的项目中?我相信这是可能的,因为我可以使用Eclipse来做到这一点。
解决方法
我目前的解决方法是将我的 SDK/库项目作为源代码(根据下面的 esaj 答案(,而不是作为 JAR 文件。与 JAR 方法相比,这有一些缺点,但我有一个在设备上成功运行的版本。
(我希望可以用以下一长串链接交叉引用这个问题?
堆栈溢出链接:
- 用于黑莓开发的持续集成服务器?(和证书签名((我没有时间经历这个,但我认为它看起来很有希望(
- 黑莓:使用库项目作为外部 Jar 时出现验证错误
- https://stackoverflow.com/questions/6134940/how-to-use-external-library-jar-file-in-blackberry
- Blackberry 5.0 - 添加对 Java 库项目的引用
- 如何在黑莓项目中添加外部jar或zip文件
- 黑莓应用程序 - 将代码签名的 jar 导入应用程序项目
- 如何在黑莓中将库项目与当前开发项目添加
这个提供了其他链接 - 非常有用:
- 处理黑莓开发中的依赖关系
这些不太有用:
- 在黑莓中,我们可以创建可供不同应用程序使用的通用库吗?
- 黑莓脸书 SDK jar 文件
- 添加和测试外部 Jar 对黑莓项目的兼容性
- 如何在黑莓中连接罐 子
- 需要黑莓RIMAPPSA2签名密钥 - 为什么?
- 是否有一个类、方法和 API 的列表,这些类、方法和 API 将在签署黑莓应用程序时触发RIMAPPSA2权限?
边缘:
- rapc.exe 工具使用的 javac 目标参数
- 添加.jar文件依赖项
- BB项目中添加的其他jar - 使用BB蚂蚁工具
- 教程:如何在应用程序中使用第三方库
您是否尝试过指向 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>
去年我遇到了类似的问题,我创建了一个"框架",用作多个 BB 应用程序的基础,但遇到了多个 COD 的问题(我不记得具体是什么,比如设备拒绝安装具有相同外部编码的多个应用程序,如果不先单独安装外部 COD,然后再安装应用程序(。由于应用程序可以单独安装(一个人可能只安装应用程序 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 Eclipsepluginsnet.rim.ejdevmTools to the componentsbin -dir
if the keys were installed using the Eclipse-plugin -->
<property name="jdehome" value="C:BBEclipsepluginsnet.rim.ejde.componentpack5.0.0_5.0.0.25components" />
<!-- Framework source locations, these must be set correctly -->
<property name="frameworkRes.dir" value="C:BBworkspaceBB_Frameworkres" />
<property name="frameworkSrc.dir" value="C:BBworkspaceBB_Frameworksrccomwhateverframe" />
<!-- 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 将应用程序构建为目标构建目录。签名、清理应用和将应用加载到模拟器有单独的任务。希望这有帮助。