BlackBerry - скрипт сборки Ant для более сложных приложений - PullRequest
9 голосов
/ 20 января 2012

У меня проблемы с созданием сценария сборки Ant для наших производственных приложений.

Я много читал об Ant и bb-ant-tools .Я проследил за многими вопросами по работе со стеками на Ant & BB (ссылки ниже в комментариях, чтобы «связать» вопросы).Я хотел бы помочь с более сложным сценарием, чем обычный "Hello World!"стиль приложений.Мой текущий процесс сборки полностью выполняется в Eclipse и выполняется вручную.

Для этого вопроса я хотел бы спросить , как использовать Ant для создания проекта, использующего 2 (или более) различных библиотечных проекта.(что тоже нужно собрать), вообще не используя Eclipse?

У меня установлен Ant, bb-ant-tools.Я собрал и развернул на устройстве базовый Hello World, используя эти инструменты на следующих примерах.Я создал скрипт сборки и несколько файлов свойств;но когда я запускаю сценарии, конечный продукт не запускается на телефоне (пользовательский интерфейс телефона зависает на экране запуска).


У меня есть 3 сценария сборки, один для каждой библиотеки и один дляосновное приложение.Они идентичны, за исключением имени проекта (и могут быть объединены в один общий импортированный скрипт в некоторый момент).Каждый из 3-х java-проектов имеет связанный с ним файл свойств Ant.Я также использую 3 файла общих свойств для определения констант, хранения информации о JDE и пароля для подписи кода.

  • common.properties:

    jde.home=C:/development/tools/bb-jde/jde4.5/components
    sigtool.jde = ${jde.home} 
    sigtool.password = xxx_pass_xxx
    
  • project.properties (для библиотеки SOAP):

    output=MySOAP
    type=midlet
    
  • project.properties (для внутренней библиотеки SDK):

    output=MySDK
    type=midlet
    

Обновление 1: Я обновил файлы свойств библиотеки с момента публикации.Ранее я установил type=library (на основе документации RIM).Основываясь на моих исследованиях, изложенных в этом посте ( BlackBerry - используйте собственный JAR-файл в собственном проекте ), я попытался изменить на type=midlet.Это дает лучшие результаты (по крайней мере, на моей платформе BB JDE 5.0).

  • project.properties (для моего приложения):

    output=MyApp
    title=App
    type=cldc
    vendor=Richard
    version=1.0.7
    description=A nice app
    icon=icon.png
    
  • build.xml (все то же самое, за исключением имени вверху, и у 2 библиотечных сценариев нет наборов файлов, объявленных внутри import.jars):

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <project name="MyApp" default="build">
    
        <!-- BLACKBERRY ANT TOOLS -->
        <property name="bb-ant-tools.home" location="C:/development/tools/bb-ant-tools" />
        <taskdef resource="bb-ant-defs.xml" classpath="${bb-ant-tools.home}/bb-ant-tools.jar" />
    
        <!-- CONFIG FILES -->
        <property file="${common.basedir}/common.properties" />
        <property prefix="project" file="project.properties" />
    
        <!-- FOLDERS -->
        <property name="dest.dir" location="build" />
    
        <!-- this is empty in the library scripts -->
        <path id="import.jars">
            <fileset dir="../MySDK/build" includes="*.jar" />
            <fileset dir="../MySOAP/build" includes="*.jar" />
        </path>
    
        <path id="src.files">
            <fileset dir="src" includes="**/*" />
            <fileset dir="res" includes="**/*" />
        </path>
    
        <!-- TARGET ACTIONS -->
    
        <target name="build" depends="">
            <mkdir dir="${dest.dir}" />
    
            <!-- work around a bug requiring app icons to be in the output folder -->
            <copy file="${basedir}/res/icon.png" tofile="${dest.dir}/icon.png" />
    
            <rapc 
                    jdehome="${jde.home}"
                    output="${project.output}" 
                    destdir="${dest.dir}" >
    
                <import refid="import.jars" />
                <src refid="src.files" />
                <jdp file="${basedir}/project.properties" />
            </rapc>
        </target>
    
        <target name="sign" depends="build">
            <sigtool
                    codfile="${dest.dir}/${project.output}.cod" 
                    jdehome="${sigtool.jde}" 
                    password="${sigtool.password}" />
        </target>
    
        <target name="clean">
            <delete dir="${dest.dir}" />
        </target>
    
    </project>
    

Обновление 2: Я обновил build.xml с момента первого поста.Target build теперь копирует значок приложения в папку вывода сборки (${dest.dir}), чтобы обойти ошибку в bb-ant-tools / rapc.


Так что это очень простой скрипт Ant, кроме:

  1. Я хотел бы знать, как вызвать вспомогательные сборки из основной сборки приложения (мой ответ ниже имеет дело с этим).
  2. Самое главное, что полученный в результате вывод не работает.

FWIW Я нашел следующие популярные ресурсы и перечислил их так, чтобы они не требовались.быть добавлены в качестве ответов и помочь любому в будущем, ищущему информацию:

Ответы [ 5 ]

1 голос
/ 04 марта 2013

Чтобы сохранить структуру ресурса вместо добавления папки res в качестве исходной папки, выполните следующие действия:

  1. Создайте временный jar-файл из всех ресурсов, используя ANTКоманда 'jar':

    <jar destfile="temp/@{brand}/res.jar"
        basedir="../@{brand}/res"
        compress="false"
        filesonly="false"
        includes="**/*"/>
    
  2. Добавить временный jar в качестве исходного элемента внутри элемента 'src' команды rapc:

    <fileset dir="temp/@{brand}" includes="res.jar"/>
    
1 голос
/ 27 января 2012

Это то, что я использую в нескольких проектах.

<macrodef name="compile">
    <attribute name="buildversion" />
    <attribute name="description" />
    <sequential>
        <mkdir dir="${build.dir}" />

        <rapc output="${cod.name}_bbminterface"  destdir="${build.dir}" verbose="false" quiet="true" nowarn="true">
            <src>
                <fileset dir="${bbminterface.src.dir}"/>
            </src>
            <import location="./lib/net_rim_bb_qm_platform.jar" />
            <jdp type="library" title="${app.name}_bbminterface" vendor="my vendor" version="@{buildversion}">
                <entry title="${app.name}_bbminterface" description=""/>    
            </jdp>
        </rapc>
        <rapc output="${cod.name}_bbmimpl" destdir="${build.dir}" verbose="false" quiet="true" nowarn="true">
            <src>
                <fileset dir="${bbmimpl.src.dir}"/>
            </src>
            <import location="./lib/net_rim_bb_qm_platform.jar" />
            <import location="${build.dir}/${cod.name}_bbminterface.jar" />
            <jdp type="library" title="${app.name}_bbmimpl" vendor="my vendor" version="@{buildversion}" runonstartup="true" startuptier="6">
                <entry title="${app.name}_bbmimpl" description="" runonstartup="true" startuptier="6"/> 
            </jdp>
        </rapc>

        <rapc output="${cod.name}" destdir="${build.dir}" verbose="false">

            <src>
                <fileset dir="${tmpsrc.dir}" />
            </src>
            <src>
                <fileset dir="${res.dir}" />
            </src>
            <src>

                <fileset file="${lib.dir}/paymentapi.jar" />
            </src>
            <import location="./lib/net_rim_bb_qm_platform.jar" />
            <import location="${build.dir}/${cod.name}_bbminterface.jar"/>

            <jdp type="cldc" title="${app.name}" vendor="my vendor" icon="../res/icon.png" version="@{buildversion}" description="@{description}" startuptier="7" ribbonposition="0">
                <entry title="${app.name}" icon="../res/icon.png" description="@{description}" runonstartup="true" arguments="boot" systemmodule="true" startuptier="7" ribbonposition="0" />
                <entry title="${app.name}" icon="../res/icon.png" description="@{description}" arguments="daemon" runonstartup="true" systemmodule="true" startuptier="7" ribbonposition="0" />
            </jdp>
        </rapc>
    </sequential>
</macrodef>

Это код компиляции. Мы компилируем несколько библиотек, а затем приложение, связывая только что созданные библиотеки.

Тогда для подписания:

<target name="sign" description="Sign the cod file">
    <sigtool codfile="${build.dir}/${cod.name}_bbminterface.cod" password=""/>
    <sigtool codfile="${build.dir}/${cod.name}_bbmimpl.cod" password=""/>
    <sigtool codfile="${build.dir}/${cod.name}.cod" password="" />
</target>

И затем загрузка на наш OTA сервер:

1 голос
/ 30 января 2012

Чтобы ответить на мой вопрос о запуске сборок для включенных проектов , из моего основного файла сборки, решение заключается в использовании задачи subant, которая является стандартной командой Ant.

Например, приведенный ниже код (я забыл, откуда я его скопировал, но он не мой, и он работает) вызовет файл build.xml в каждой из предоставленных папок и запустит цель export-all в этой сборке.file.

    <subant target="export-all">
        <dirset dir="${basedir}/.." includes="${project.deps}" />
        <property name="export.dir" location="build/lib" />
    </subant>

Требуется, чтобы свойство с именем project.deps было объявлено как список папок через запятую.dirset определяется путем поиска одной папки из основного файла build.xml и поиска каждой из подпапок в project.deps.

Затем Ant найдет файл build.xml в каждой из этих папок.и запустите его, ища цель export-all.

В каждой из новых подзадач export-all будет установлено свойство export.dir, которое позволяет передавать информацию из основной сборки..xml в подзадачи.

0 голосов
/ 13 мая 2012

Я видел вопрос о том, как сохранить структуру каталогов ресурсов в комментарии Дирала к ответу Джо . Несколько дней назад я нашел обходной путь здесь ( Blackberry Development с Ant & Eclipse ) в комментариях к посту:

yuri wrote:
I found a way 

You just need to copy the resources temporarily to the output folder, and delete them
after the build is over. The key is that the resources must be in the working folder
of the compiler.

Posted 18 Jan 2008 at 5:08 pm ¶
0 голосов
/ 22 января 2012

Я надеюсь, что вы не забудете отправить ваши библиотечные коды вместе с вашим кодом приложения конечному пользователю.Потому что в противном случае приложение не будет работать.

О запуске сборки библиотеки - я предпочитаю сборку библиотек только тогда, когда это необходимо - изменился код или зависимость.

О решении для вас, я бы просто взял файл bat, гдеЯ буду запускать муравей три раза с разными файлами build.xml и соответствующими текущими файлами (потому что у тебя в ant-скриптах есть относительные каталоги).Так было бы как:

cd librarydir1
ant
cd librarydir2
ant
cd appfolder
ant
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...