有人能告诉我如何编写用于从.proto文件创建.jar文件的ant规则(build.xml
)吗?
基本上,我编写了一个函数example.proto
,我可以使用命令行protoc
来输出java文件。但我想要一个蚂蚁规则来自动化上述过程作为我构建的一部分。有人可以共享代码片段作为起点吗?
答案 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>