42

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

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

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

  2. おそらくもっと現実的です: 実際のプラグインが不足している場合protoc、Maven 2 ビルドから他にどのように呼び出すことができますか? antrun既存のシェルスクリプトを呼び出しなどに結び付けることができると思います。

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

4

9 に答える 9

44

Protocol Buffers ディスカッション グループのProtocol Buffers Compiler Maven Plug-Inスレッドの Protocol Buffers リポジトリで利用可能なプラグインに関する情報を見つけることができます。私の理解では、それは使用可能ですが、テストが不足しています。試してみます。

または、プラグインを使用することもでき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>
于 2009-10-16T14:58:27.943 に答える
23

受け入れられた回答により、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。要点は、このプラグインは、それを実行するためにフープをジャンプする必要がなくなったときに使用できるようになるということです.

于 2009-10-16T15:55:42.233 に答える
21

受け入れられたソリューションは、複数の 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>
于 2010-06-09T14:58:12.920 に答える
10

protobuf-maven-pluginという名前の Igor Petruk による優れたプラグインもあります。現在は中央リポジトリにあり、Eclipse とうまく連携しています (m2e-1.1 をお勧めします)。

于 2012-02-20T08:42:26.663 に答える
4

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>
于 2016-06-08T10:20:10.550 に答える
4

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

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

直後の

<protocExecutable>protoc</protocExecutable>.

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

于 2010-12-22T09:52:44.500 に答える
4

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 構成を使用できます。

于 2009-11-19T01:01:32.150 に答える
0

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

于 2011-09-11T20:04:31.957 に答える