2010-09-02 2 views
1

Может ли кто-нибудь показать мне, как писать правила ant (build.xml) для создания файла .jar из .proto-файла?Объект Ant для создания файлов буфера протокола протокола

В принципе, я написал функциональный example.proto, и я могу использовать командную строку protoc для вывода java-файлов. Но я хочу, чтобы правило муравья автоматизировало вышеупомянутый процесс как часть моей сборки. Может ли кто-нибудь поделиться фрагментом кода для начальной точки?

ответ

1

Похоже, вам нужна задача Ant Exec выполнить двоичный код, чтобы создать .java из файлов .proto. Затем Javac task скомпилирует их, и Jar task создаст ваш файл .jar.

Как вы связываете все это вместе? This tutorial представляет Ant и как использовать такие задачи, как выше.

2

Я знаю, что этот вопрос древний, но он по-прежнему является одним из лучших хитов в Google для «ant protoc».

Я был разочарован тем, что я не мог найти муравей задачу protoc, так что я писал мой собственный: https://github.com/okorz001/ant-protoc

Это довольно примитивно на данный момент, но он поддерживает вложенные наборы файлов, которые что-то я не мог понять, как сделать с exec hacks. (Я отнюдь не специалист по муравьям.) Задача только выполняет protoc; вам нужно будет использовать муравьиные javac и jar задачи, чтобы создать банку.

2

Протокол компиляции также можно выполнить с помощью ant exec.

<!-- Generates protocol buffers. --> 
    <property name="proto.srcs" value="../protos" /> 
    <target name="proto"> 
    <exec executable="protoc" failonerror="true"> 
     <arg value="--java_out=." /> 
     <arg value="--proto_path=${proto.srcs}" /> 
     <arg line="${proto.srcs}/my.proto" /> 
    </exec> 
    </target> 
1

Вот что я сделал, чтобы включить protoc в проект. В идеале я бы использовал <mapper>, но связать файлы .proto с их файлами .java не является тривиальным, так что пока я просто касаюсь файла маркера каждый раз, когда запускается protoc. Ключ - это задача <uptodate>, которая позволяет вам установить свойство, основанное на относительном возрасте двух наборов файлов (true, если оно старше, чем false, в противном случае).

<property name="proto.messages" value="proto"/> 
<property name="proto.src" value="src-proto"/> 
<property name="proto.markerfile" value="${proto.src}/markerfile"/> 

<target name="init"> 
    <uptodate property="skip.protogen" targetfile="${proto.markerfile}"> 
    <srcfiles dir="${proto.messages}" /> 
    </uptodate> 
    ... 
</target> 

<target name="clean"> 
    <delete dir="${proto.src}"/> 
    ... 
</target> 

<target name="protoc" depends="init" unless="skip.protogen"> 
    <!-- delete first to ensure clean build --> 
    <delete dir="${proto.src}"/> 
    <mkdir dir="${proto.src}" /> 
    <apply executable="protoc" failonerror="true"> 
    <arg prefix="--java_out=" file="${proto.src}" /> 
    <arg prefix="--proto_path=" file="${proto.messages}" /> 
    <fileset dir="${proto.messages}" includes="**/*.proto" /> 
    </apply> 
    <touch file="${proto.markerfile}" /> 
</target> 

<target name="build" depends="init,protoc,..."> 
    <javac ...> 
    <src path="${proto.src}"/> 
    ... 
    </javac> 
</target>