我正在使用maven-antrun-plugin来执行一个节俭的shell命令。我可以使用<arg value="...path/to/file.thrift" />
编译每个<exec>
一个文件,但我想编译目录中的所有.thrift
文件。我该怎么做?
我尝试使用<arg value="...path/to/*.thrift" />
,但Maven拒绝了这种语法。
有几个选项可以在 maven 项目中编译节俭文件:
选项 1:使用 maven 节俭插件(最好的一个)
Maven Thrift插件支持生成源代码/测试源代码,修改时重新编译等。 基本上,这是在Maven项目中使用节俭的最方便的方式。
- 将您的来源放在
src/main/thrift
(或src/test/thrift
用于测试节俭的来源)。 - 将 thrift 二进制文件安装到/usr/local/bin/thrift(或任何其他你喜欢的地方)
-
将插件添加到pom的
plugins
部分.xml:<plugin> <groupId>org.apache.thrift.tools</groupId> <artifactId>maven-thrift-plugin</artifactId> <version>0.1.11</version> <configuration> <thriftExecutable>/usr/local/bin/thrift</thriftExecutable> </configuration> <executions> <execution> <id>thrift-sources</id> <phase>generate-sources</phase> <goals> <goal>compile</goal> </goals> </execution> <execution> <id>thrift-test-sources</id> <phase>generate-test-sources</phase> <goals> <goal>testCompile</goal> </goals> </execution> </executions> </plugin>
就是这样:下次调用mvn compile
Java 源代码将从节俭中生成。生成的源代码将被放置在target/generated-sources/thrift/
目录中,并且此目录将被添加到 java 编译器的编译路径中。
您可以在 Github: https://github.com/dtrott/maven-thrift-plugin 上找到详细说明、示例和更多信息。
选项 2:使用 Maven Antrun 插件
如果出于某种原因需要使用 antrun 插件,最好使用 apply
命令而不是exec
来处理一组文件。
我将只写一个关于 ant target 的基本概念,因为修改时的条件重新编译可能超出了这个问题的范围:
<target name="compile-thrift">
<!-- Define fileset of thrift files -->
<fileset id="thrift.src.files" dir="${src.thrift.dir}">
<include name="**/*.thrift"/>
</fileset>
<!-- Invoke thrift binary for each of these files -->
<apply executable="${thrift.compiler}" resultproperty="thrift.compile.result"
failifexecutionfails="true" failonerror="true"
searchpath="true" dir="${src.thrift.dir}">
<arg value="-o"/>
<arg value="${thrift.dest.dir}"/>
<arg value="--gen"/>
<arg value="java"/>
<srcfile/>
<fileset refid="thrift.src.files"/>
</apply>
</target>
选项 3:将 antrun 与执行 ant 任务一起使用
如果出于某种原因绝对有必要使用 Antrun 插件并exec
任务,有一种方法可以做到这一点。我建议不要这样做,因为它很丑,不便携,但它可能会起作用。使用 xargs
调用 Thrift 编译器以获取文件列表:
<exec dir="${src.thrift.dir}" executable="bash">
<arg line="ls * | xargs ${thrift.compiler} -o ${thrift.dest.dir} --gen java"/>
</exec>
我正在玩节俭 0.10.0 并发现为了使用 maven-thrift-plugin,我必须提供generator
选项:
<plugin>
<groupId>org.apache.thrift.tools</groupId>
<artifactId>maven-thrift-plugin</artifactId>
<version>0.1.11</version>
<configuration>
<thriftSourceRoot>${basedir}/src/main/resources/thrift</thriftSourceRoot>
<generator>java</generator>
</configuration>
<executions>
<execution>
<id>thrift-sources</id>
<phase>generate-sources</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>thrift-test-sources</id>
<phase>generate-test-sources</phase>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
否则它会抱怨"未知选项java:hashcode"。事实上,似乎在java生成器中不再有这样的选项。 thrift --help
提供了以下选项:
java (Java):
beans: Members will be private, and setter methods will return void.
private-members: Members will be private, but setter methods will return 'this' like usual.
nocamel: Do not use CamelCase field accessors with beans.
fullcamel: Convert underscored_accessor_or_service_names to camelCase.
android: Generated structures are Parcelable.
android_legacy: Do not use java.io.IOException(throwable) (available for Android 2.3 and above).
option_type: Wrap optional fields in an Option type.
java5: Generate Java 1.5 compliant code (includes android_legacy flag).
reuse-objects: Data objects will not be allocated, but existing instances will be used (read and write).
sorted_containers:
Use TreeSet/TreeMap instead of HashSet/HashMap as a implementation of set/map.
generated_annotations=[undated|suppress]:
undated: suppress the date at @Generated annotations
suppress: suppress @Generated annotations entirely
有没有办法避免引用节俭可执行文件?我想要那个Maven 下载在启动时加载该生成器。(见此)
maven-thrift-plugin
通常需要您在构建服务器中安装 Thrift 编译器,因为它需要在 <thriftExecutable>
中引用其路径。
对于不想这样做的人,如果您的构建服务器已经安装了 docker 运行时 ,另一种选择是使用已经由这样的人创建和共享的 docker 映像对其进行编译。所以
选项 4:使用 Docker 映像
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.42.1</version>
<configuration>
<images>
<image>
<name>cspwizard/thrift:0.18.1</name>
<run>
<platform>linux/amd64</platform>
<volumes>
<bind>
<volume>src/main/resources:/data</volume>
<volume>src/main/java:/out</volume>
</bind>
</volumes>
<cmd>--gen java -out /out -v -r /data/build.thrift</cmd>
</run>
</image>
</images>
</configuration>
<executions>
<execution>
<id>start</id>
<phase>generate-sources</phase>
<goals>
<goal>start</goal>
</goals>
</execution>
</executions>
</plugin>
此配置假定您将所有 .thrift 文件放在 src/main/resources/data
中。 build.thrift
是主入口文件,您需要手动包含要编译的所有.thrift:
include "foo.thrift"
include "bar.thrift"
include ........
它需要这样做,仅仅是因为节俭编译器不支持指定要编译的 .thrift 文件列表。(有关详细信息,请参阅此处)。