‹Export-Package› для всех ресурсов с использованием maven-bundle-plugin

В качестве временной меры, чтобы иметь возможность быстро перейти на OSGi, мне нужно создать одну банку со всеми моими библиотеками. Что я сделал, так это поместил все библиотеки jar в src/main/resources, чтобы они оказались в корне созданного jar. Проблема, с которой я сталкиваюсь, заключается в том, чтобы сообщить плагину maven-bundle-plugin экспортировать ВСЕ пакеты в банках. Итак, в основном, я хочу предоставить все свои библиотеки другим пакетам OSGi.

Это первое, что я попробовал в своем POM.

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <extensions>true</extensions>
            <configuration>
                <instructions>
                    <Export-Package>*</Export-Package>
                    <Bundle-Name>${project.artifactId}</Bundle-Name>
                    <Bundle-Version>${project.version}</Bundle-Version>
                </instructions>
            </configuration>
        </plugin>
    </plugins>
</build>`

Я пытался экспортировать все, что было. Но похоже, что единственное, что экспортируется таким образом, — это две зависимости osgi, а не файлы jar в ресурсах.

У меня более сотни библиотек, поэтому я пытаюсь найти автоматизированный способ заполнения директивы <Export-Package> вместо того, чтобы вручную добавлять каждый пакет библиотеки. Каким-то образом eclipse делает это в среде разработки плагинов, но мне нужно сделать это с помощью maven. Возможно ли это вообще с плагином пакета? Дополнительные очки, если банки будут добавлены в <Bundle-ClassPath>


person Hilikus    schedule 17.07.2012    source источник


Ответы (3)


Вы должны добавить jar-файлы в качестве зависимостей в файл pom.xml, а затем использовать следующую формулировку для вашего плагина maven-bundle-plugin в теге ‹build›:

<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <extensions>true</extensions>
    <configuration>
        <manifestLocation>META-INF</manifestLocation>
        <instructions>
            <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
            <Bundle-Version>${project.version}</Bundle-Version>
            <Export-Package>*</Export-Package>
            <Bundle-Activator>your.activator.package.Activator</Bundle-Activator>
            <Embed-Dependency>*;scope=compile|runtime</Embed-Dependency>
            <Embed-Directory>target/dependency</Embed-Directory>
            <Embed-StripGroup>true</Embed-StripGroup>
            <Embed-Transitive>true</Embed-Transitive>
        </instructions>
    </configuration>
</plugin>

<plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Также добавьте следующее, чтобы все работало с m2e:

См.: maven-dependency-plugin (цели « copy-dependencies", "unpack") не поддерживается m2e

<pluginManagement>
    <plugins>
        <!-- Ignore/Execute plugin execution -->
    <plugin>
            <groupId>org.eclipse.m2e</groupId>
            <artifactId>lifecycle-mapping</artifactId>
            <version>1.0.0</version>
            <configuration>
                <lifecycleMappingMetadata>
                    <pluginExecutions>
                        <!-- copy-dependency plugin -->
                        <pluginExecution>
                <pluginExecutionFilter>
                                <groupId>org.apache.maven.plugins</groupId>
                                <artifactId>maven-dependency-plugin</artifactId>
                                <versionRange>[1.0.0,)</versionRange>
                                <goals>
                                    <goal>copy-dependencies</goal>
                                </goals>
                            </pluginExecutionFilter>
                            <action>
                                <ignore />
                            </action>
                        </pluginExecution>
                    </pluginExecutions>
                </lifecycleMappingMetadata>
            </configuration>
        </plugin>
    </plugins>
</pluginManagement>

Также добавьте следующее, чтобы заставить его работать с Eclipse PDE (взято из веб-сайт Apache Felix):

<profiles>
    <profile>
        <activation>
            <property>
                <name>m2e.version</name>
            </property>
        </activation>
        <properties>
            <osgi-version-qualifier>qualifier</osgi-version-qualifier>
        </properties>
        <build>
            <pluginManagement>
                <plugins>
                    <plugin>
                        <groupId>org.apache.felix</groupId>
                        <artifactId>maven-bundle-plugin</artifactId>
                        <configuration>
                            <!-- PDE does not honour custom manifest location -->
                            <manifestLocation>META-INF</manifestLocation>
                        </configuration>
                    </plugin>
                </plugins>
            </pluginManagement>
        </build>
    </profile>
</profiles>
person cstroe    schedule 22.11.2013

Согласно документации для плагина пакета, вы можете использовать {local-packages}, и это будет распространено на все пакеты в проекте.

ОДНАКО это очень плохая идея! Задумайтесь на секунду, вы говорите, что все в вашем пакете должно быть общедоступным API. Это означает, что вы должны поддерживать все эти пакеты, следить за тем, чтобы вы тщательно развивали их, используя правильные версии и т. д. По сути, вы не модульны.

В идеале для любого пакета OSGi должно быть экспортировать как можно меньше пакетов.

person Neil Bartlett    schedule 17.07.2012
comment
да, я знаю, что это плохая идея. Библиотеки в конечном итоге будут импортированы в репозиторий maven и управляться по отдельности, но на переходный период мне нужно упаковать все в один пакет библиотек. Импорт всех этих библиотек в maven требует времени - person Hilikus; 18.07.2012

Я думаю, что это невозможно. Банки должны быть индивидуально в репозитории maven, чтобы иметь возможность создать «библиотечный проект», добавив их в качестве зависимостей в библиотечный проект; в противном случае банки не будут в пути к классам. Хорошей ссылкой для этого является эта страница

person Hilikus    schedule 05.11.2012
comment
Ссылка не работает. Пожалуйста, измените его, если можете. - person xmlParser; 12.03.2018