Как избежать машинно-зависимого POM с помощью компилятора MinGW и плагина nar-maven-plugin

У меня есть простой проект на основе 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, работающий независимо от машины?

2 ответа

Решение

Кажется, что ответ Герольда Брозера противоположен тому, что я хотел, но он помог мне правильно выбрать профиль. Одним из приемов для меня было осознать, что нормально делать частичную спецификацию отдельного плагина в профиле, в то время как другие параметры этого же плагина помещаются в основной 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>

Это типичный пример использования профилей сборки:

Однако иногда портативность не совсем возможна. [...] И в других случаях вам даже может понадобиться включить целый плагин в жизненный цикл сборки в зависимости от обнаруженной среды сборки.

Итак, поместите ваши различные конфигурации плагинов в профили и активируйте их соответствующим образом при сборке.

Альтернативой является использование свойства, такого как:

<option>${options}</option>

это определено со значением как следующее в случае:

mvn ... -Doptions=-Wl,--kill-at
Другие вопросы по тегам