任何人都可以告訴我如何編寫用於從.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>