任何人都可以告诉我如何编写用于从.proto文件创建.jar文件的蚂蚁规则(build.xml
)?构建协议缓冲文件的Ant目标
基本上,我写了一个功能example.proto
,我可以使用命令行protoc
输出java文件。但是我想要一个ant规则来自动完成上面的过程,作为我的构建的一部分。有人可以分享一个代码片段的起点吗?
任何人都可以告诉我如何编写用于从.proto文件创建.jar文件的蚂蚁规则(build.xml
)?构建协议缓冲文件的Ant目标
基本上,我写了一个功能example.proto
,我可以使用命令行protoc
输出java文件。但是我想要一个ant规则来自动完成上面的过程,作为我的构建的一部分。有人可以分享一个代码片段的起点吗?
听起来好像您需要Ant Exec任务来执行二进制文件以从.proto
文件创建.java
。 Javac task然后将编译这些和Jar task构建您的.jar
文件。
你如何将所有这一切联系在一起? This tutorial介绍了Ant以及如何利用上述任务。
我知道这个问题很古老,但它仍然是谷歌对“ant protoc”的热门搜索引擎之一。
我很失望,我无法找到protoc一个Ant任务,所以我写我自己:https://github.com/okorz001/ant-protoc
这是目前相当原始,但它支持嵌套文件集这是我无法弄清楚如何处理exec黑客。 (我绝不是一个蚂蚁专家。)任务只执行protoc;您需要使用ant的股票javac和jar任务才能生成jar。
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>
以下是我所做的将protoc
合并到一个项目中。理想情况下,我会使用<mapper>
,但将.proto
文件与它们的.java
文件关联并不重要,因此同时我只需在每次运行protoc
时触摸一个标记文件。 关键是<uptodate>
任务,它允许您根据两组文件的相对年龄设置属性(如果from大于则为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>