Maven Tycho: не действительная версия OSGi - программирование

Maven Tycho: не действительная версия OSGi

в моем проекте Я пытаюсь экспортировать приложение Eclipse RCP с помощью Maven/Tycho.

Все плагины (и сам продукт) используют следующий шаблон версии, когда в конфигурации релиза "SNAPSHOT":

OSGI: x.y.z.qualifier
MVN:  x.y.z-SNAPSHOT

доставка будет использовать следующий шаблон

OSGI: x.y.z.vyyyyMMddHHmm
MVN:  x.y.z-vyyyyMMddHHmm

Как вы можете заметить, существует только разница между "-" и "."

Для RCP-плагинов мне пришлось отключить проверку того, что tycho выполняет проверку версии, используя следующий плагин maven

<build>
    <plugins>
        <plugin>
            <groupId>org.eclipse.tycho</groupId>
            <artifactId>tycho-packaging-plugin</artifactId>
            <version>0.22.0</version>
            <configuration>
                <strictVersions>false</strictVersions>
            </configuration>
        </plugin>
    </plugins>
</build>

Пока все в порядке.

Когда приходит продукт приложения RCP, у меня есть следующий файл pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>XXXXXX.user-interfaces</groupId>
        <artifactId>user-interfaces-parent-pom</artifactId>
        <version>0.2.0-v201505041341</version>
        <relativePath>../../poms/parent-pom</relativePath>
    </parent>


    <artifactId>XXXXXX.product</artifactId>
    <name>XXXXXX.product</name>
    <packaging>eclipse-repository</packaging>

    <!-- Make OSGi happy -->
    <!-- version>0.2.0.v201505041341</version-->

    <build>
        <plugins>
            <plugin>
                <groupId>org.eclipse.tycho</groupId>
                <artifactId>tycho-p2-director-plugin</artifactId>
                <version>${tycho.version}</version>
                <executions>
                    <execution>
                        <id>create-product-distributions</id>
                        <goals>
                            <goal>materialize-products</goal>
                            <goal>archive-products</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

Родительский pom.xml просто определяет еще пару вещей, таких как репозиторий P2 и шаг сборки tycho-maven-plugin.

<build>
    <plugins>
        <plugin>
            <groupId>org.eclipse.tycho</groupId>
            <artifactId>tycho-maven-plugin</artifactId>
            <extensions>true</extensions>
        </plugin>
    </plugins>
</build>

Проблема Когда я компилирую моментальный снимок, все работает нормально, но как только я изменяю SNAPSHOT с TIMESTAMP, как объяснялось выше, Maven Tycho жалуется, что дает мне следующую трассировку стека:

[ERROR] Failed to execute goal org.eclipse.tycho:tycho-packaging-plugin:0.22.0:build-qualifier-aggregator (default-build-qualifier-aggregator) on project XXXXXX.product: Not a valid OSGi version 0.2.0-v201505041341 for project MavenProject: XXXXX.user-interfaces:XXXXXX.product:0.2.0-v201505041341 @ /local/XXXXX/pom.xml -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.eclipse.tycho:tycho-packaging-plugin:0.22.0:build-qualifier-aggregator (default-build-qualifier-aggregator) on project XXXXXX.product: Not a valid OSGi version 0.2.0-v201505041341 for project MavenProject: XXXXXX.user-interfaces:XXXXXX.product:0.2.0-v201505041341 @ /local/XXXXXXX/pom.xml
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:212)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:120)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:347)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:154)
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:582)
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:214)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:158)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
Caused by: org.apache.maven.plugin.MojoFailureException: Not a valid OSGi version 0.2.0-v201505041341 for project MavenProject: XXXXXXX.user-interfaces:XXXXXX.product:0.2.0-v201505041341 @ /local/XXXXXX/pom.xml
    at org.eclipse.tycho.buildversion.BuildQualifierMojo.getParsedOSGiVersion(BuildQualifierMojo.java:177)
    at org.eclipse.tycho.buildversion.BuildQualifierMojo.calculateQualifiedVersion(BuildQualifierMojo.java:143)
    at org.eclipse.tycho.buildversion.BuildQualifierMojo.execute(BuildQualifierMojo.java:134)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:132)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
    ... 19 more

Я посмотрел на исходный код, и я заметил, что Tycho пытается получить версию из артефакта Maven, а не из самого файла продукта.

Единственный способ заставить его работать - удалить комментарий в pom.xml

<!-- Make OSGi happy -->
<version>0.2.0.v201505041341</version>

Есть ли способ заставить Tycho работать с "-" вместо "." или сообщить ему, чтобы получить версию из другого места?

Спасибо

4b9b3361

Ответ 1

Tycho поддерживает "-" только для распознавания SNAPSHOT для квалификатора OSGI, в другом случае он должен быть в формате x.x.x.x.

Вы можете использовать set-version maven цель https://eclipse.org/tycho/sitedocs/tycho-release/tycho-versions-plugin/set-version-mojo.html для установки версии OSGI перед выпуском.

Например, вы используете предопределенную версию 1.0.0-SNAPSHOT (1.0.0.qualifier) ​​для разработки и перед выпуском. Вам нужно вызвать mvn tycho-versions:set-version -DnewVersion=1.0.2.qualifier или mvn tycho-versions:set-version -DnewVersion=1.0.2.v123456

Он изменит ваши источники, после чего вы можете создать продукт с обновленной версией mvn package

Ответ 2

Вы можете создать пакет OSGI с плагином maven-bundle.

В моем приложении много плагинов, но я думаю, что демонстрация покажет, как это работает:

http://felix.apache.org/documentation/subprojects/apache-felix-maven-bundle-plugin-bnd.html

Pro: Он отлично работает с maven

Con: Это первый путь. Вам нужно будет настроить импорт и экспорт пакетов в maven, а затем воссоздать MANIFEST.MF