Maven — как обрабатывать сгенерированные классы

#eclipse #maven #wsdl

#eclipse #maven #wsdl

Вопрос:

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

Я пытаюсь сгенерировать некоторые классы из WSDL, и я действительно не знаю, каков стандартный способ обработки результирующих исходных файлов.

  • Где я должен генерировать исходные файлы .java? (src /main / java, src /main/ сгенерированный)
  • Должен ли я включать их в систему управления версиями или позволять им генерироваться после извлечения
  • Если я не использую папку src / main / java, как убедить Eclipse автоматически «видеть» эти классы в качестве исходной папки?
  • Мне действительно нужны файлы .java или только .class-ы?

Каковы рекомендации по этой проблеме? Приветствуется любая помощь или совет.

Спасибо за ваши добрые ответы, Марк

Ответ №1:

Большинство плагинов Maven, с которыми я сталкивался, которые генерируют код, следуют соглашению о размещении сгенерированных исходных файлов Java в подкаталоге target/generated-sources папки. Для примера плагин Maven 2 JAXB 2.x генерирует исходные тексты Java в target/generated-sources/xjc папке.

Пока сборка повторяется, я не вижу необходимости передавать сгенерированные исходные коды в мой репозиторий исходного кода. Поэтому я обычно настраиваю свой Git, Mercurial, SVN или что-то еще, что я использую, чтобы игнорировать все, что находится под target .

Обычно я вручную редактирую .classpath файл, чтобы включить исходную папку для Eclipse, и сохраняю оба файла .classpath и .project в репозитории исходного кода.

Вот пример:

 <?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"/>
    <classpathentry kind="src" path="target/generated-sources/xjc"/>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
    <classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
    <classpathentry kind="output" path="target/classes"/>
</classpath>
  

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

Ответ №2:

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

  • Где я должен генерировать исходные файлы .java? (src /main / java, src /main/ сгенерированный)
  • Я поместил их в src/main/com/mypackage/generated . Таким образом, они уже находятся в пути к классам, и вам не потребуется никакой другой ручной настройки, чтобы Eclipse компилировался без ошибок.
  • Должен ли я включать их в систему управления версиями или позволять им генерироваться после извлечения
  • Раньше я ИХ НЕ включал, но после некоторых проблем (разработчики не создавали их, потому что забыли, отсутствие плагина IDE Maven и т. Д.) Мы в конечном итоге добавляем их в систему управления версиями. Это помогло любому узнать, что существует пакет сгенерированных исходных текстов, который не появился волшебным образом, быстро проверить изменения схемы, просто изучив папку (некоторые исходные файлы больше не существуют и т.д.) и увидеть реальный размер приложения.
  • Если я не использую папку src / main / java, как убедить Eclipse автоматически «видеть» эти классы в качестве исходной папки?
  • Решается с помощью src/main/com/mypackage/generated.
  • Мне действительно нужны файлы .java или только .class-ы?
  • Я бы предложил использовать файлы .java.

Только мои два цента, после многих лет использования JAXB, в основном для генерации WSDL на Java.

Ответ №3:

Вот моя рекомендация после многих лет: поместите всю свою генерацию кода в отдельный проект maven и полагайтесь на него в своих обычных проектах, которым нужен сгенерированный код.

  • Сделайте a mvn install для вашего сгенерированного кода, если это СНИМОК.
  • Если вы не знаете, что делаете, я не рекомендую помещать сгенерированный код в подмодуль, иначе Eclipse будет постоянно путаться, потому что большинство людей импортируют все подмодули (т.Е. многомодульный проект)
  • Однако, если вы решите сделать мультимодульный (т.Е. сгенерированный код является родственным проектом), вы можете либо:
    • В частности, не импортировать проект в Eclipse и использовать mvn install в отдельном проекте
    • Полагайтесь на плагины жизненного цикла m2e и плагин Build Helper (это хорошо работает только при определенной генерации кода, которая активно поддерживается).
  • Если вам нужно отладить сгенерированный код, я настоятельно рекомендую прикрепить исходные коды к jar с помощью плагина maven-attach-sources.

Хотя многомодульный подход кажется хорошей идеей на практике, он просто становится чертовски раздражающим, потому что Eclipse будет выходить из синхронизации каждый раз, когда вы вытаскиваете, если есть новый СНИМОК.

Если ваш сгенерированный код генерируется не так часто, просто отпустите его, чтобы он не был МОМЕНТАЛЬНЫМ СНИМКОМ (очевидно, для этого требуется настройка надлежащего репозитория maven).