4

OSGi に迅速に移行できるようにするための一時的な手段として、すべてのライブラリを含む 1 つの jar を作成する必要があります。私がしたことは、作成されたjarのルートになるように、すべてのjarライブラリをsrc/main/resourcesに配置することでした。私が抱えている問題は、maven-bundle-plugin に jar 内のすべてのパッケージをエクスポートするように指示することです。基本的に、すべてのライブラリを他の 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>`

そこにあるものすべてをエクスポートしようとしました。しかし、このようにエクスポートされるのは、リソース内の jar ではなく、2 つの osgi 依存関係だけのようです

私は 100 以上のライブラリを持っているので、<Export-Package>各ライブラリのパッケージを手動で追加する代わりに、ディレクティブを自動的に設定する方法を見つけようとしています。どういうわけかEclipseはプラグイン開発環境でそれを行いますが、これはmavenを使用して行う必要があります。これはバンドルプラグインでまったく可能ですか? ジャーが追加された場合の追加ポイント<Bundle-ClassPath>

4

3 に答える 3

6

jar を依存関係として pom.xml に追加し、<build>タグで maven-bundle-plugin に次の式を使用する必要があります。

<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 Web サイトから取得)。

<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>
于 2013-11-22T19:05:06.127 に答える
4

バンドル プラグインのドキュメントによると、使用でき{local-packages}、これはプロジェクト内のすべてのパッケージに展開されます。

しかし、これは本当に悪い考えです!ちょっと考えてみてください。あなたは、バンドル内のすべてが公開 API であるべきだと言っているのです。つまり、これらのパッケージをすべて維持する必要があり、それらを慎重に、正しいバージョンなどで進化させる必要があります。基本的に、モジュール化されていません。

OSGi バンドルの理想は、できるだけ少ないパッケージをエクスポートすることです。

于 2012-07-17T22:16:03.707 に答える
1

これは不可能だと思います。ライブラリプロジェクトに依存関係として追加することで「ライブラリプロジェクト」を作成できるようにするには、jarをMavenリポジトリに個別に配置する必要があります。そうしないと、jarはクラスパスに含まれません。これを行うための良いリファレンスはこのページです

于 2012-11-05T18:13:31.550 に答える