Как заставить Eclipse разрешать классы, созданные с помощью Maven 2?
Я использую буферы протокола Google для создания некоторых классов Java для моего проекта. Используя Maven 2 и его плагин "antrun", эти классы только что сгенерированы перед компиляцией, выводятся в целевые/сгенерированные источники и помещаются в путь к классам во время сборки. Поэтому создание проекта с ПОМ не представляет проблемы.
Однако Eclipse не знает, как разрешить сгенерированный класс, потому что папка, в которой он находится, по-видимому, не находится на пути класса IDE во время разработки. Я использую m2eclipse и управляю зависимостями для меня, поэтому я ожидал, что Maven позаботится об этом.
Как я могу получить поддержку IDE (завершение кода и т.д.) для сгенерированного кода?
Ответы
Ответ 1
То, что вы должны увидеть в своем проводнике проектов, представляет собой контейнер с именем "Maven Dependencies" вместо обычных "Реферированных библиотек". Это означает, что m2eclipse управляет вашим контуром сборки.
В моем случае для этого я проверил "Включить модули" и снял флажок "Плагин компилятора Skip Maven при обработке ресурсов" в разделе "Maven" в Project- > Properties.
Ответ 2
m2eclipse не поддерживает это. Вы должны вручную добавить папку target/generated-sources
в качестве исходной папки. Когда вы укажете m2eclipse на "Обновить конфигурацию проекта", это будет перезаписано, и вы должны восстановить его.
Кроме того, убедитесь, что Eclipse ищет изменения в рабочей области.
Однако могут быть некоторые проблемы. В конце концов, вы столкнетесь с ошибками, которые не могут быть скомпилированы каким-либо классом, потому что другой класс не может быть разрешен. Однако завершение кода будет работать. Основной причиной этой проблемы является то, что Eclipse запутывается, когда Maven меняет файлы классов в target
.
Чтобы решить эту проблему, вы должны сообщить Eclipse компиляции в другое место, чем Maven.
Ответ 3
m2eclipse поддерживает это. Сначала добавьте путь к пути сборки:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<id>add-source</id>
<phase>generate-sources</phase>
<goals>
<goal>add-source</goal>
</goals>
<configuration>
<sources>
<source>${project.build.directory}/generated-sources/java/</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
Во-вторых, добавьте поддержку для m2e:
<pluginManagement>
<plugins>
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<versionRange>[1.0,)</versionRange>
<goals>
<goal>parse-version</goal>
<goal>add-source</goal>
<goal>maven-version</goal>
<goal>add-resource</goal>
<goal>add-test-resource</goal>
<goal>add-test-source</goal>
</goals>
</pluginExecutionFilter>
<action>
<execute>
<runOnConfiguration>true</runOnConfiguration>
<runOnIncremental>true</runOnIncremental>
</execute>
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement>
Второй шаг может быть не нужен, если в вашей установке eclipse установлен плагин "org.eclipse.m2e.discovery.lifecyclemapping.buildhelper.xml". Этот плагин доступен через Window → Preferences → Maven → Discovery. В настоящее время это не работает здесь, в Eclipse Kepler, поэтому я получил JAR (связанный с xml, указанным в URL-адресе каталога), и извлек фрагменты из org.eclipse.m2e.discovery.lifecyclemapping.buildhelper.xml
вручную.
Ответ 4
Лично я решил эту проблему, настроив сгенерированные классы как отдельный проект и сделал его зависимым в моем основном (не сгенерированном) проекте. Я использовал wsdl2java для генерации классов webservice, поэтому "источником" в моем подпроекте были wdsl и xsds. Хорошо работал, даже когда wsdl постоянно менялся.
Ответ 5
У меня была эта проблема с кодом, сгенерированным с использованием Maven и wsdl2java, и вот что я сделал в Eclipse Juno для его решения. Предположим, что мой проект называется project1:
- Щелкните правой кнопкой мыши проект1 и выберите "Свойства"
- Выберите "Путь сборки Java" слева и выберите вкладку "Библиотеки"
- Нажмите "Добавить класс"
- Выберите каталог bin и нажмите OK (project1/target/generated-sources/bin)
- Нажмите "ОК" и "Обновить проект"
В качестве дополнительного бонуса вы также можете прикрепить исходный код:
- Щелкните стрелку рядом с созданной вами новой папкой класса
- Нажмите ссылку "Источник"
- Нажмите кнопку "Изменить"
- Задайте путь к /project 1/target/generated-sources/axis2/src
- Нажмите "ОК"
Ответ 6
Вы пытались обновить проект Eclipse?
(источник: oyvindhauge.com)
Когда внешний инструмент генерирует новые файлы или обновляет старые, Eclipse не сможет обнаружить изменение до следующего запроса.
Другой вариант - определить новый пользовательский компоновщик, указав для этого компоновщика "обновление ресурсов по завершении":
альтернативный текст http://www.cs.lth.se/EDA180/2005/Verktyg/eclipse_refresh.gif
Ответ 7
- Щелкните правой кнопкой мыши проект и выберите "Свойства"
- Выберите "Путь сборки Java" слева и выберите вкладку "Источник"
- Нажмите "Добавить папку"
- Выберите каталог bin и нажмите OK
- (project/target/generated-sources/xxxx) Нажмите "ОК" и "Обновить проект"
Ответ 8
Как получить поддержку IDE (завершение кода и т.д.) Для сгенерированного кода?
Обычно я бы добавил плагин m2e для отображения жизненного цикла в файл pom.xml, как описано в ответе @koppor. Тем не менее, добавление кода для каждого затмения в мои файлы pom.xml не вариант для работы, в основном это магазин IntelliJ.
Мое решение сначала добавляет build-helper-maven-plugin
в файл pom.xml, который отлично работает из командной строки, но не в затмении.
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>add-source</goal>
</goals>
<configuration>
<sources>
<source>${project.build.directory}/generated-sources/</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
Чтобы исправить затмение, я установил Apt M2E Connector с Eclipse Marketplace. Я думаю, что все заработало сразу после перезапуска, а затем перестроил все мои проекты. Теперь я вижу следующее в моих источниках:
src/main/java
target/generated-sources
...
функция!
Ответ 9
Для генерации исходных файлов Java из файлов .proto
используйте плагин Protocol Buffers, который работает в .proto
Oxygen.
Основное использование (см. Здесь для подробного описания):
-
убедитесь, что в вашей системе установлен protoc
компилятор protoc
-
обновите файл pom.xml
:
-
убедитесь, что вы используете хотя бы Java 6 (рекомендуется Java 7+)
-
добавить вызов плагина
-
добавьте соответствующую зависимость для com.google.protobuf:protobuf-java
-
поместите ваши .proto файлы в директорию проекта src/main/proto
-
обновить проект (через Maven → Update project...
)
Пример pom.xml
:
<project>
...
<build>
<plugins>
<!-- Require at least Java 6 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<!-- Generate .java files from .proto definitions -->
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.5.1</version>
<configuration>
<protocExecutable>/usr/local/bin/protoc</protocExecutable>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
...
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.5.1</version>
</dependency>
...
</dependencies>
...
</project>
Некоторые дополнительные заметки:
Удачи!