1

我有一个简单的基于 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?

4

2 回答 2

1

这是构建配置文件的典型用例:

然而,有时可移植性并非完全可行。[...] 在其他时候,您甚至可能需要在构建生命周期中包含整个插件,具体取决于检测到的构建环境。

因此,将您不同的插件配置放入配置文件并在构建时相应地激活它们。

另一种方法是使用如下属性:

<option>${options}</option>

在以下情况下使用如下值定义:

mvn ... -Doptions=-Wl,--kill-at
于 2017-06-29T23:10:59.427 回答
1

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>
于 2017-06-30T14:33:30.713 回答