使用 MinGW 编译器和 nar-maven-plugin 避免依赖机器的 POM
Avoiding machine-dependent POM with MinGW compiler and nar-maven-plugin
我有一个简单的基于 JNI 的项目来试验 nar-maven-plugin
。我 运行ning Windows 10 并且正在使用 MinGW 编译器。我正在将本机代码编译为 C++ 而不是 C,尽管我认为这对这个问题并不重要。 ("real" 项目中的本机实现将使用 C++,所以一旦我超越了这个初始测试,仅仅改变它就不是微不足道的了。)
为了通过 Eclipse IDE 使用 maven install
进行此构建,我需要在 POM 文件中明确指定 linker 作为插件的一部分 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 专门用于某些机器/link 用户。如果我将其完全取出,则会出现此错误:
[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>
部分并只删除选项,那么它会编译但我的测试失败,因为它不能 link 到 运行 时的本机实现。 (这与 --kill-at
标志和一个已知问题有关,所以这不是一个可怕的惊喜。)
是否有一种已知的方法来处理这个问题,以便我得到一个独立于机器的 POM?
这是 Build Profiles 的典型用例:
However, sometimes portability is not entirely possible. [...] And at still other times, you may even need to include a whole plugin in the build lifecycle depending on the detected build environment.
因此,将您不同的插件配置放入配置文件中,并在构建时相应地激活它们。
另一种方法是使用 属性,例如:
<option>${options}</option>
在以下情况下使用如下值定义:
mvn ... -Doptions=-Wl,--kill-at
Gerold Broser 的回答似乎与我想要的相反,但它确实让我走上了使用配置文件的正确道路。对我来说,其中一个技巧是意识到可以在配置文件中对单个插件进行部分规范,同时将同一插件的其他参数放在主 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>
我有一个简单的基于 JNI 的项目来试验 nar-maven-plugin
。我 运行ning Windows 10 并且正在使用 MinGW 编译器。我正在将本机代码编译为 C++ 而不是 C,尽管我认为这对这个问题并不重要。 ("real" 项目中的本机实现将使用 C++,所以一旦我超越了这个初始测试,仅仅改变它就不是微不足道的了。)
为了通过 Eclipse IDE 使用 maven install
进行此构建,我需要在 POM 文件中明确指定 linker 作为插件的一部分 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 专门用于某些机器/link 用户。如果我将其完全取出,则会出现此错误:
[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>
部分并只删除选项,那么它会编译但我的测试失败,因为它不能 link 到 运行 时的本机实现。 (这与 --kill-at
标志和一个已知问题有关,所以这不是一个可怕的惊喜。)
是否有一种已知的方法来处理这个问题,以便我得到一个独立于机器的 POM?
这是 Build Profiles 的典型用例:
However, sometimes portability is not entirely possible. [...] And at still other times, you may even need to include a whole plugin in the build lifecycle depending on the detected build environment.
因此,将您不同的插件配置放入配置文件中,并在构建时相应地激活它们。
另一种方法是使用 属性,例如:
<option>${options}</option>
在以下情况下使用如下值定义:
mvn ... -Doptions=-Wl,--kill-at
Gerold Broser 的回答似乎与我想要的相反,但它确实让我走上了使用配置文件的正确道路。对我来说,其中一个技巧是意识到可以在配置文件中对单个插件进行部分规范,同时将同一插件的其他参数放在主 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>