Компилятор Eclipse maven не поддерживает compilerArgs плагина компилятора

У нас есть коллекция проектов модулей Java (с использованием JDK11).

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

Решением было добавить экспорт с помощью compilerArgs в наш проект тестирования интеграции:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven.compiler.plugin.version}</version>
            <configuration>
                <release>${java.version}</release>
                <parameters>true</parameters>
                <showDeprecation>true</showDeprecation>
                <showWarnings>true</showWarnings>
                <compilerArgs>
                    <arg>--add-exports</arg>
                    <arg>com.example.application/com.example.application=com.example.integration_tests</arg>
                </compilerArgs>
            </configuration>
        </plugin>
    </plugins>
</build>

Это работает для командной строки mvn clean install. Но, к сожалению, для затмения это не работает. По какой-то причине eclipse игнорирует эти compilerArgs и продолжает выдавать ошибки о том, что основной класс приложения недоступен.

Есть ли способ заставить eclipse использовать эти compilerArgs? Или это какой-то аспект модульной системы, который Eclipse еще не успел охватить?


person SvenT23    schedule 30.04.2019    source источник


Ответы (2)


Аргумент компилятора --add-exports можно установить вручную для зависимостей Maven в .classpath файле, заменив

<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
    <attributes>
        <attribute name="maven.pomderived" value="true"/>
    </attributes>
</classpathentry>

с участием

<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
    <attributes>
        <attribute name="add-exports" value="com.example.application/com.example.application=com.example.integration_tests"/>
        <attribute name="maven.pomderived" value="true"/>
    </attributes>
</classpathentry>

К сожалению, щелкнув проект правой кнопкой мыши и выбрав Maven ›Обновить проект ..., вы измените ручные настройки, если параметр Выбрано "Обновить конфигурацию проекта из pom.xml" (по умолчанию).

См. Ошибка Eclipse 543631 - Eclipse - Maven - JPMS (прокомментируйте и проголосуйте, если вы хотите использовать эту функцию)

Чтобы восстановить ручные настройки после обновления проекта, вы можете заменить файл .classpath его версией перед обновлением проекта.

Пожалуйста, рассмотрите следующие альтернативы отдельному проекту для тестового кода, который использует JPMS, но имеет доступ к внутреннему содержимому модуля:

  • Поместите тестовый код в src/test/java/, а не в отдельный проект (доступ к внутренним компонентам указывает, что это модульный тест, а не интеграционный тест)
  • В отдельном (интеграционном) тестовом проекте не иметь доступа ко всему необходимому модулю.
  • Не используйте JPMS в отдельном (интеграционном) тестовом проекте.
person howlger    schedule 30.04.2019
comment
Ручной способ работает только для модулей внутри JRE. В данном случае это еще один модуль, сделанный мной. Конкретная зависимость Is modular не может быть изменена, и модуль нельзя найти в диалоговом окне добавления экспорта ни в системной библиотеке JRE, ни в общих зависимостях maven. Тем не менее, спасибо за ссылку на ошибку Eclipse. Надеюсь, это будет рассмотрено. - person SvenT23; 30.04.2019
comment
@ SvenT23 У меня работает редактирование файла .classpath (см. Мой отредактированный ответ). Если вы хотите, чтобы этот запрос функции был рассмотрен, вы не должны называть его ошибкой или говорить, что вы очень разочарованы. Как разработчик с открытым исходным кодом вы предпочитаете тратить свое время на то, чтобы делать счастливых людей более счастливыми, чем разочарованные люди менее разочарованными. Вы также должны показать, что это важно для вас, создав пример для воспроизведения проблемы и потратив некоторое время на изучение кода (и, возможно, предложив решение). Две трети из примерно 80 ошибок, о которых я сообщил Eclipse, уже были исправлены таким образом. - person howlger; 30.04.2019
comment
Я сказал, что было очень неприятно видеть ошибки, потому что это то, что показывает eclipse, ошибка. Вы, вероятно, правы насчет расстроенной части, но запомните это. - person SvenT23; 02.05.2019

Элемент <compilerArgs> требует, чтобы <fork>true</fork>, который отсутствует в выдержке Maven pom в вопросе. См. документацию maven-compiler-plugin.

person MikeOnline    schedule 21.05.2021