web-dev-qa-db-ja.com

プロトコルバッファーをMaven2ビルドに統合する

既存のかなりバニラMaven 2プロジェクトでプロトコルバッファーを実験しています。現在、生成されたソースを更新する必要があるたびに、シェルスクリプトを呼び出しています。各ビルドの前にソースを自動的に生成したいので、これは明らかに面倒です。うまくいけば、恥ずべきハッカーに頼ることはありません。

だから、私の質問は2つあります:

  1. ロングショット:Maven 2用の「プロトコルバッファープラグイン」は、上記を自動魔法の方法で実現できますか? Google Codeのブランチ があり、そのプラグインの実装に著者が挑戦したようです。残念ながら、それは コードレビューに合格していません またはprotobufトランクにマージされています。したがって、そのプラグインのステータスは不明です。

  2. おそらくより現実的です:実際のプラグインが不足している場合、Maven 2ビルドからprotocを呼び出すにはどうすればよいでしょうか?既存のシェルスクリプトをantrun呼び出しまたは類似の呼び出しに接続できると思います。

個人的な経験が最も高く評価されています。

42
Max A.

プロトコルバッファーディスカッショングループの Protocol Buffers Compiler Maven Plug-In スレッドのプロトコルバッファーリポジトリで利用可能なプラグインに関するいくつかの情報が見つかります。私の理解では、それは使用可能ですが、テストが不足しています。やってみます。

または、antrunプラグインを使用することもできます(上記のスレッドから貼り付けられたスニペット):

 <build>
   <plugins>
     <plugin>
       <artifactId>maven-antrun-plugin</artifactId>
       <executions>
         <execution>
           <id>generate-sources</id>
           <phase>generate-sources</phase>
           <configuration>
             <tasks>
               <mkdir dir="target/generated-sources"/>
               <exec executable="protoc">
                 <arg value="--Java_out=target/generated-sources"/>
                 <arg value="src/main/protobuf/test.proto"/>
               </exec>
             </tasks>
             <sourceRoot>target/generated-sources</sourceRoot>
           </configuration>
           <goals>
             <goal>run</goal>
           </goals>
         </execution>
       </executions>
     </plugin>
   </plugins>
 </build>

 <dependencies>
   <dependency>
     <groupId>com.google.protobuf</groupId>
     <artifactId>protobuf-Java</artifactId>
     <version>2.0.3</version>
   </dependency>
 </dependencies>
44
Pascal Thivent

受け入れられた回答 は、Google提供のプラグインを機能させることを奨励しました。私の質問で述べたブランチを2.2.0ソースコードのチェックアウトにマージし、プラグインをビルドしてインストール/デプロイし、次のようにプロジェクトで使用できました。

  <build>
    <plugins>
      <plugin>
        <groupId>com.google.protobuf.tools</groupId>
        <artifactId>maven-protoc-plugin</artifactId>
        <version>0.0.1</version>
        <executions>
          <execution>
            <id>generate-sources</id>
            <goals>
              <goal>compile</goal>
            </goals>
            <phase>generate-sources</phase>
            <configuration>
              <protoSourceRoot>${basedir}/src/main/protobuf/</protoSourceRoot>
              <includes>
                <param>**/*.proto</param>
              </includes>
            </configuration>
          </execution>
        </executions>
        <configuration>
          <protocExecutable>/usr/local/bin/protoc</protocExecutable>
        </configuration>
      </plugin>
    </plugins>
  </build>

プラグインのバージョンを0.0.1(-SNAPSHOTなし)に変更して、スナップショットではないサードパーティのNexusリポジトリにプラグインを追加することに注意してください。 YMMV。要点は、このプラグインを実行するためにフープをジャンプする必要がなくなると、このプラグインが使用可能になることです。

23
Max A.

承認されたソリューションは、複数のprotoファイルに対応できません。私は自分で考えなければなりませんでした:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-antrun-plugin</artifactId>
            <executions>
                <execution>
                    <id>compile-protoc</id>
                    <phase>generate-sources</phase>
                    <configuration>
                        <tasks>
                            <mkdir dir="${generated.sourceDirectory}" />
                            <path id="proto.path">
                                <fileset dir="src/main/proto">
                                    <include name="**/*.proto" />
                                </fileset>
                            </path>
                            <pathconvert pathsep=" " property="proto.files" refid="proto.path" />
                            <exec executable="protoc" failonerror="true">
                                <arg value="--Java_out=${generated.sourceDirectory}" />
                                <arg value="-I${project.basedir}/src/main/proto" />
                                <arg line="${proto.files}" />
                            </exec>
                        </tasks>
                    </configuration>
                    <goals>
                        <goal>run</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
</build>
21
jsravn

protobuf-maven-plugin という名前のIgor Petrukによる素晴らしいプラグインもあります。現在は中央レポにあり、Eclipseでうまく動作します(m2e-1.1をお勧めします)。

10
morgwai

私は https://github.com/dtrott/maven-protoc-plugin の公式ではないがごく最近の(v 0.1.7)フォークを試してみましたが、David Trottの好意で非常にうまく機能しました。私はいくつかのMavenモジュールでテストしました。そのうちの1つはDTOスタイルのメッセージを含み、もう1つはそれらに依存するサービスを含みます。 09年10月16日に投稿されたMaxAプラグイン構成を借りました。PATHにprotocがあり、追加しました

<temporaryProtoFileDirectory>${basedir}/target/temp</temporaryProtoFileDirectory>

直後の

<protocExecutable>protoc</protocExecutable>

本当にいいのは、DTOモジュールのサービスモジュールから通常の依存関係を宣言することだけです。プラグインは、DTOモジュールにパッケージされているプロトファイルを見つけ、一時ディレクトリに抽出し、サービスのコードを生成するときに使用することにより、プロトファイルの依存関係を解決できました。また、生成されたDTOクラスの2番目のコピーをサービスモジュールと一緒にパッケージ化しないことは十分に賢明でした。

4
ndolgov

Protobuf用のmavenプラグインがあります。 https://www.xolstice.org/protobuf-maven-plugin/usage.html

最小限の設定

 <plugin>
    <groupId>org.xolstice.maven.plugins</groupId>
    <artifactId>protobuf-maven-plugin</artifactId>
    <version>0.5.0</version>
    <configuration>
      <protocExecutable>/usr/local/bin/protoc</protocExecutable>
    </configuration>
    <executions>
      <execution>
        <goals>
          <goal>compile</goal>
          <goal>test-compile</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
4
smartwjw

2.2.0で動作するようにmavenプラグインを更新しました-更新されたpomはコードレビューのバグに添付されています。

プラグインを自分でビルドする手順は次のとおりです。

svn co http://protobuf.googlecode.com/svn/branches/maven-plugin/tools/maven-plugin
cd maven-plugin
wget -O pom.xml 'http://protobuf.googlecode.com/issues/attachment?aid=8860476605163151855&name=pom.xml'
mvn install

その後、上記のmaven設定を使用できます。

4
mrm

antrunを使用して非Mavenステップを呼び出すことは、一般的に受け入れられているソリューションだと思います。

maven-exec-plugin を試すこともできます。

0
matt b

私は、David Trottからのプラグインを分岐し、複数の言語をコンパイルして、それをより便利にしました。 githubプロジェクト here およびMavenビルドとの統合に関するチュートリアル here を参照してください。

0
Usman Ismail