Генерация источников путем запуска Java-класса проекта в Maven - PullRequest
10 голосов
/ 27 января 2010

Я конвертирую большой муравейник в Maven. В рамках сборки Ant у нас есть несколько шагов, которые создали классы Java путем вызова одного из классов проекта, упрощенного как:

javac SomeGenerator.java
java  SomeGenerator  generated # generate classes in generated/
javac generated/*.java

Я разбил каждый генератор на отдельный модуль Maven, но у меня возникла проблема с невозможностью запустить генератор, поскольку он еще не скомпилирован в фазе generate-sources.

Я пробовал что-то похожее на

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.1.1</version>
            <executions>
                <execution>
                    <id>generate-model</id>
                    <goals>
                        <goal>java</goal>
                    </goals>
                    <phase>generate-sources</phase>

                    <configuration>
                        <mainClass>DTOGenerator</mainClass>
                        <arguments>
                            <argument>${model.generated.dir}</argument>
                        </arguments>
                    </configuration>
                </execution>
            </executions>
        </plugin>

Что, к сожалению, не работает по причинам, изложенным выше. Разделение генераторов кода на два проекта каждый, один для компиляции генератора, а другой для генерации DTO, кажется излишним.

Какие есть альтернативы?


Использование Maven 2.2.1.

Ответы [ 4 ]

7 голосов
/ 27 января 2010

Вы можете запустить maven-compile-plugin на этапе создания источников. Просто добавьте еще одно выполнение перед существующим и настройте его так, чтобы оно просто подбирало источники для генератора.

Или разделите проект на две части: создайте генератор с отдельным POM и включите библиотеку генератора в качестве зависимости от POM, генерирующего источники.

Лично я бы разделил проект. Сохраняет файлы сборки более чистыми и простыми в обслуживании.

2 голосов
/ 03 апреля 2017

Мне не хотелось иметь 2 разных проекта, поэтому я попытался настроить Maven для добавления сгенерированного скомпилированного кода в окончательный пакет jar.

Это рабочее решение, которое я использовал:

  • В фазе process-classes (выполняется сразу после фазы compile):
    • exec-maven-plugin для выполнения основного класса, способного генерировать мои исходные файлы в папке target/generated-sources/java (в моем конкретном случае я использовал Roaster library для генерации исходного кода);
    • build-helper-maven-plugin для добавления сгенерированных источников в правильное местоположение
  • В prepare-package фазе:
    • maven-compiler-plugin, чтобы обнаружить изменения и перекомпилировать модуль
    • maven-jar-plugin для изготовления упаковки из банки

Это мой pom.xml:

<build>
    <plugins>

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.6.0</version>
            <executions>
                <execution>
                    <phase>process-classes</phase>
                    <goals>
                        <goal>java</goal>
                    </goals>
                    <configuration>
                        <mainClass>com.example.MyClassWriter</mainClass>
                        <arguments>
                            <argument>${project.basedir}</argument>
                            <argument>${project.build.directory}</argument>
                        </arguments>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <version>3.0.0</version>
            <executions>
                <execution>
                    <phase>process-classes</phase>
                    <goals>
                        <goal>add-source</goal>
                    </goals>
                    <configuration>
                        <sources>
                            <source>${project.build.directory}/generated-sources/java</source>
                        </sources>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.6.1</version>
            <executions>
                <execution>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.0.2</version>
            <executions>
                <execution>
                    <phase>prepare-package</phase>
                </execution>
            </executions>
        </plugin>

    </plugins>
</build>
1 голос
/ 27 января 2010

Мы столкнулись с той же проблемой. Мы хотели уважать поведение Maven как можно точнее, чтобы не было проблем с плагинами и так далее ... Борьба с Maven слишком дорога!

Мы поняли, что частота обновления сгенерированного кода обычно сильно отличается от кода, который мы пишем вручную, поэтому разделение кода имело очень хорошие характеристики производительности для сборки. Поэтому мы согласились иметь сгенерированные классы как зависимость от написанного вручную.

Мы приняли следующую структуру, в которой было только одно небольшое изменение по сравнению с обычной конфигурацией maven - изменение в исходном каталоге.

Родительский проект: Поколения

Мы создали родительский проект для всех наших поколений .

  • Он имеет тип JAR, если содержит код для компиляции, в противном случае POM.
  • Там у нас есть генерирующий код в / src.
  • Может компилироваться в / target как обычно.
  • Он запускает генерацию, каждый генератор генерирует код в подкаталоге /target.

Примечание: если вы хотите получить несколько сгенерированных результатов в одном банке, просто поместите их в один и тот же подкаталог.

Проекты в детских баночках: Generateds

  • Это подкаталог проекта Generations.
  • Имеет тип JAR.
  • Исходный каталог указывает на подкаталог в целевом родительском объекте.

    <sourceDirectory>../target/generated1</sourceDirectory>

  • Обычно компилируется в свой каталог / target.


Эта структура позволяет нам:

  • имеет как можно меньше модификаций стандартного макета maven, поэтому каждая команда и плагин maven продолжает работать хорошо.
  • хорошо масштабируется, если у вас несколько генераторов,
  • хорошо масштабируется, если вы хотите сгенерировать несколько jar-файлов (у нас был случай wsdl2java, где один генератор генерировал код, который должен быть разбит на несколько jar-файлов; каждый дочерний сгенерированный проект имел бы один и тот же исходный каталог, но был бы настроен с <includes> для обработки только некоторых классов).
0 голосов
/ 13 ноября 2017

Я разместил здесь минимальную рабочую настройку https://github.com/baloise/inlinesourcecodegenerator Он использует компилятор компилятора сборки и плагины exec и имеет весь код в одном проекте.

...