如何将所有 .thrift 文件 (*.thrift) 编译为 Maven 阶段



我正在使用maven-antrun-plugin来执行一个节俭的shell命令。我可以使用<arg value="...path/to/file.thrift" />编译每个<exec>一个文件,但我想编译目录中的所有.thrift文件。我该怎么做?

我尝试使用<arg value="...path/to/*.thrift" />,但Maven拒绝了这种语法。

有几个选项可以在 maven 项目中编译节俭文件:

选项 1:使用 maven 节俭插件(最好的一个)

Maven Thrift插件支持生成源代码/测试源代码,修改时重新编译等。 基本上,这是在Maven项目中使用节俭的最方便的方式。

  1. 将您的来源放在src/main/thrift(或src/test/thrift用于测试节俭的来源)。
  2. 将 thrift 二进制文件安装到/usr/local/bin/thrift(或任何其他你喜欢的地方)
  3. 将插件添加到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 文件列表。(有关详细信息,请参阅此处)。

相关内容

  • 没有找到相关文章

最新更新