Подтвердить что ты не робот

Интеграция буферов протоколов в сборку Maven2

Я экспериментирую с протокольными буферами в существующем, довольно ванильном проекте Maven 2. В настоящее время я вызываю оболочку script каждый раз, когда мне нужно обновлять мои сгенерированные источники. Это, очевидно, хлопот, так как я хотел бы, чтобы источники генерировались автоматически перед каждой сборкой. Надеюсь, не прибегая к постыдному хакерству.

Итак, мой вопрос в два раза:

  • Длинный снимок: есть ли плагин протокола для буферов для Maven 2, который может достичь вышеуказанного в автоматическом режиме? Там есть ветвь в Google Code, автор которой, похоже, сделал попытку реализовать такой плагин. К сожалению, он не прошел обзор кода или не был объединен в protobuf trunk. Статус этого плагина, таким образом, неизвестен.

  • Вероятно, более реалистично: отсутствует реальный плагин, как еще я могу вызвать вызов protoc из моей сборки Maven 2? Я полагаю, что я могу подключить существующую оболочку script к вызову antrun или что-то подобное.

Личный опыт наиболее ценится.

4b9b3361

Ответ 1

Вы найдете некоторую информацию о плагине, доступном в репозитории протокольных буферов, в потоке протоколов буфера компилятора Maven в протоколе Буферная дискуссионная группа. Я понимаю, что это полезно, но не хватает тестов. Я бы попробовал.

Или вы можете просто использовать плагин antrun (snipet, вставленный из упомянутого выше потока):

 <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>

Ответ 2

Подтвержденный ответ помог мне настроить плагин 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 (no -SNAPSHOT), чтобы он попал в мой репозиторий Nexus третьего лица. YMMV. Вывод заключается в том, что этот плагин будет использоваться, если уже не нужно перепрыгивать через обручи, чтобы добиться этого.

Ответ 3

Принятое решение не масштабируется для нескольких прото файлов. Я должен был придумать свой собственный:

<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>

Ответ 4

Там также отличный плагин Игоря Петрука по имени protobuf-maven-plugin. Сейчас он находится в центральном репо и отлично играет с затмением (рекомендуется использовать m2e-1.1).

Ответ 5

Я только что обновил плагин maven для работы с 2.2.0 - обновленный 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 выше.

Ответ 6

Я просто попробовал менее официальную, но очень недавнюю (v 0.1.7) fork из https://github.com/dtrott/maven-protoc-plugin, и она работала очень хорошо, любезно Дэвид Тротт. Я тестировал его с помощью нескольких модулей Maven, один из которых содержал сообщения в стиле DTO, а другой - в зависимости от них. Я заимствовал конфигурацию плагина MaxA, размещенную 16 октября 2009 года, у меня был protoc на моем PATH, и я добавил

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

сразу после

<protocExecutable>protoc</protocExecutable>.

Что действительно приятно, так это то, что все, что мне нужно было сделать, - объявить нормальную зависимость от сервисного модуля модуля DTO. Плагин смог разрешить зависимостей прото файлов, найдя прото файлы, упакованные с модулем DTO, извлекая их во временный каталог и используя при создании кода для службы. И это было достаточно разумно, чтобы не упаковывать вторую копию сгенерированных классов DTO с сервисным модулем.

Ответ 7

Для протобуфа есть плагин 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>

Ответ 8

Я думаю, что использование antrun для вызова шагов без Maven является общепринятым решением.

Вы также можете попробовать maven-exec-plugin.

Ответ 9

Я искал плагин от Дэвида Тротта и собираю его на нескольких языках, что делает его намного более полезным. См. Проект github здесь и учебник по интеграции его с maven build здесь.