У меня есть простой проект на основе JNI, чтобы поэкспериментировать с nar-maven-plugin
, Я использую Windows 10 и использую компиляторы MinGW. Я компилирую нативный код как C ++, а не C, хотя я не думаю, что это имеет значение для этого вопроса. (Нативные реализации в «реальном» проекте будут использовать C ++, поэтому просто изменить это не тривиально, когда я выйду за рамки этого первоначального теста.)
Чтобы сделать эту сборку с maven install
через Eclipse IDE мне нужно явно указать компоновщик в файле POM как часть плагина configuration
, Соответствующий раздел здесь:
<plugin>
<groupId>com.github.maven-nar</groupId>
<artifactId>nar-maven-plugin</artifactId>
<version>3.5.1</version>
<extensions>true</extensions>
<configuration>
<linker>
<name>g++</name>
<options>
<option>-Wl,--kill-at</option>
</options>
</linker>
<libraries>
<library>
<type>jni</type>
<narSystemPackage>com.mycompany.sandbox</narSystemPackage>
</library>
</libraries>
</configuration>
</plugin>
Если я это сделаю, то у меня все хорошо на локальной машине, но я считаю, что я специализировал свой POM для определенных машин / компоновщиков. Если я уберу это полностью, тогда я получу эту ошибку:
[INFO] --- nar-maven-plugin:3.5.1:nar-validate (default-nar-validate) @ nar-test ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.786 s
[INFO] Finished at: 2017-06-29T17:05:34-04:00
[INFO] Final Memory: 8M/23M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal com.github.maven-nar:nar-maven-plugin:3.5.1:nar-validate (default-nar-validate) on project nar-test: Execution default-nar-validate of goal com.github.maven-nar:nar-maven-plugin:3.5.1:nar-validate failed. NullPointerException -> [Help 1]
Если я оставлю <name>g++</name>
Разбейте и удалите только параметры, затем он скомпилируется, но мой тест не пройден, поскольку он не может связываться с собственной реализацией во время выполнения. (Это связано с --kill-at
флаг и известная проблема, так что это не страшный сюрприз.)
Есть ли известный способ справиться с этой проблемой, чтобы получить POM, работающий независимо от машины?
Это типичный вариант использования Профили сборки:
Однако иногда портативность не совсем возможна. […] И в других случаях вам даже может понадобиться включить целый плагин в жизненный цикл сборки в зависимости от обнаруженной среды сборки.
Итак, поместите ваши различные конфигурации плагинов в профили и активируйте их соответствующим образом при сборке.
Альтернативой является использование свойства, такого как:
<option>${options}</option>
это определено со значением как следующее в случае:
mvn ... -Doptions=-Wl,--kill-at
Кажется, что ответ Герольда Брозера противоположен тому, что я хотел, но он помог мне правильно выбрать профиль. Одним из приемов для меня было осознать, что нормально делать частичную спецификацию отдельного плагина в профиле, в то время как другие параметры для того же плагина помещаются в основной build
раздел. Хотя в этом случае это не нужно, поскольку мне не нужно указывать что-то другое в ситуации по умолчанию, я также пришел к выводу, что хотел бы activeByDefault
на моих настройках по умолчанию, а не с помощью activeProfiles
как было предложено.
Для полноты, соответствующие части рабочего POM приведены ниже:
<profiles>
<!-- This default not needed since is specifies nothing, but this seems to be the correct syntax if it were needed
<profile>
<id>Default-CPP-Tools</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
-->
<profile>
<id>Windows-MinGW</id>
<activation>
<os>
<family>Windows</family>
</os>
</activation>
<build>
<plugins>
<plugin>
<groupId>com.github.maven-nar</groupId>
<artifactId>nar-maven-plugin</artifactId>
<version>3.5.1</version>
<extensions>true</extensions>
<configuration>
<linker>
<name>g++</name>
<options>
<option>-Wl,--kill-at</option>
</options>
</linker>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<build>
<defaultGoal>integration-test</defaultGoal>
<plugins>
<plugin>
<groupId>com.github.maven-nar</groupId>
<artifactId>nar-maven-plugin</artifactId>
<version>3.5.1</version>
<extensions>true</extensions>
<configuration>
<libraries>
<library>
<type>jni</type>
<narSystemPackage>com.mycompany.sandbox</narSystemPackage>
</library>
</libraries>
</configuration>
</plugin>
</plugins>
</build>