用于构建协议缓冲区文件的Ant目标

时间:2010-09-02 22:46:25

标签: java ant protocol-buffers

有人能告诉我如何编写用于从.proto文件创建.jar文件的ant规则(build.xml)吗?

基本上,我编写了一个函数example.proto,我可以使用命令行protoc来输出java文件。但我想要一个蚂蚁规则来自动化上述过程作为我构建的一部分。有人可以共享代码片段作为起点吗?

4 个答案:

答案 0 :(得分:2)

我知道这个问题很古老,但它仍然是谷歌“ant protoc”的热门歌曲之一。

我很失望,因为我找不到protoc的蚂蚁任务,所以我写了自己的:https://github.com/okorz001/ant-protoc

目前这是相当原始的,但它支持嵌套文件集,这是我无法弄清楚如何处理exec hacks。 (我绝不是蚂蚁专家。)任务只执行protoc;你将需要使用ant的股票javac和jar任务来生产一个罐子。

答案 1 :(得分:2)

Proto编译也可以通过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>

答案 2 :(得分:1)

听起来您需要Ant Exec任务来执行二进制文件以从.java文件创建.proto。然后Javac task会对这些内容进行编译,而Jar task会构建您的.jar文件。

你如何将所有这些结合在一起? This tutorial介绍了Ant以及如何使用上述任务。

答案 3 :(得分:1)

以下是我将protoc合并到项目中所做的工作。理想情况下,我会使用<mapper>,但将.proto文件与其.java文件相关联并非易事,因此在此期间,每次protoc运行时,我只需触摸一个标记文件。 关键是<uptodate>任务,它允许您根据两组文件的相对年龄设置属性(如果from早于to,则为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>