web-dev-qa-db-ja.com

Karaf / Maven-解決できません:要件osgi.wiring.packageがありません

Karaf(バージョン3.0.1)でバンドルを開始できません。

バンドルはmavenを使用して構築され、 gson をインポートします。

必要に応じてMavenにgsonを含めました。

<dependency>
     <groupId>com.google.code.gson</groupId>
     <artifactId>gson</artifactId>
     <version>2.3.1</version>
</dependency>

ビルドはうまくいきます。ただし、バンドルを展開すると、Karafから次の警告が表示されます。

2015-05-27 12:45:07,371 | WARN  | 49-19-bin/deploy | fileinstall                      | 11 - org.Apache.felix.fileinstall - 3.2.8 | Error while starting bundle: file:/Users/user/Documents/tools/MyBundle-1.0.0-SNAPSHOT.jar
org.osgi.framework.BundleException: Unresolved constraint in bundle MyBundle [121]: Unable to resolve 121.13: missing requirement [121.13] osgi.wiring.package; (&(osgi.wiring.package=com.google.gson)(version>=2.3.0)(!(version>=3.0.0)))
at org.Apache.felix.framework.Felix.resolveBundleRevision(Felix.Java:3974)[org.Apache.felix.framework-4.2.1.jar:]
at org.Apache.felix.framework.Felix.startBundle(Felix.Java:2037)[org.Apache.felix.framework-4.2.1.jar:]
at org.Apache.felix.framework.BundleImpl.start(BundleImpl.Java:955)[org.Apache.felix.framework-4.2.1.jar:]
at org.Apache.felix.fileinstall.internal.DirectoryWatcher.startBundle(DirectoryWatcher.Java:1263)[11:org.Apache.felix.fileinstall:3.2.8]
at org.Apache.felix.fileinstall.internal.DirectoryWatcher.startBundles(DirectoryWatcher.Java:1235)[11:org.Apache.felix.fileinstall:3.2.8]
at org.Apache.felix.fileinstall.internal.DirectoryWatcher.startAllBundles(DirectoryWatcher.Java:1224)[11:org.Apache.felix.fileinstall:3.2.8]
at org.Apache.felix.fileinstall.internal.DirectoryWatcher.process(DirectoryWatcher.Java:519)[11:org.Apache.felix.fileinstall:3.2.8]
at org.Apache.felix.fileinstall.internal.DirectoryWatcher.run(DirectoryWatcher.Java:308)[11:org.Apache.felix.fileinstall:3.2.8]

バンドルはインストールされていません。

Import-Package の中に MANIFEST.MFで始まる:

Import-Package: com.google.gson;version="[2.3,3)"

私はそれを変更しようとしました:

Import-Package: com.google.code.gson;version="[2.3,3)"

しかし、それは私に同様のエラーを与えます:

missing requirement [121.13] osgi.wiring.package; (&(osgi.wiring.package=com.google.code.gson)

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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>groupid</groupId>
    <artifactId>artifactid</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

<groupId>groupid</groupId>
<artifactId>MyBundle</artifactId>
<version>1.0.0-SNAPSHOT</version>

<packaging>bundle</packaging>

<name>MyBundle</name>
<description>MyBundle</description>

<properties>
    <skipTests>true</skipTests>
</properties>

<dependencies>
    ...
    <dependency>
        <groupId>org.Apache.felix</groupId>
        <artifactId>org.Apache.felix.http.jetty</artifactId>
    </dependency>
    <dependency>
        <groupId>org.json</groupId>
        <artifactId>com.springsource.org.json</artifactId>
    </dependency>
    <dependency>
        <groupId>org.Apache.servicemix.bundles</groupId>
        <artifactId>org.Apache.servicemix.bundles.commons-httpclient</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>9.4-1201-jdbc41</version>
    </dependency>
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.3.1</version>
    </dependency>
    <dependency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
        <version>1.10</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.Apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <extensions>true</extensions>
            <configuration>
                <instructions>
                    <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
                </instructions>
            </configuration>
        </plugin>
          <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                  <skipTests>${skipTests}</skipTests>
            </configuration>
          </plugin>
    </plugins>
</build>

</project>

MANIFEST.MF Google GSON(バンドルのビルド時にMavenがダウンロードするバージョン)は次のとおりです。

Manifest-Version: 1.0
Export-Package: com.google.gson;version=2.3.1, com.google.gson.annotat
 ions;version=2.3.1, com.google.gson.reflect;version=2.3.1, com.google
 .gson.stream;version=2.3.1, com.google.gson.internal;version=2.3.1, c
 om.google.gson.internal.bind;version=2.3.1
Bundle-ClassPath: .
Built-By: inder
Bundle-Name: Gson
Created-By: Apache Maven 3.2.1
Bundle-RequiredExecutionEnvironment: J2SE-1.5, JavaSE-1.6, JavaSE-1.7,
  JavaSE-1.8
Bundle-Vendor: Google Gson Project
Bundle-ContactAddress: http://code.google.com/p/google-gson/
Build-Jdk: 1.6.0_65
Bundle-Version: 2.3.1
Bundle-ManifestVersion: 2
Bundle-Description: Google Gson library
Bundle-SymbolicName: com.google.gson
Archiver-Version: Plexus Archiver

私も試しました

<build>
    <plugins>
        <plugin>
            <groupId>org.Apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <extensions>true</extensions>
            <configuration>
                <instructions>
                    <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
                    <Import-Package>*;resolution:=optional</Import-Package>
                    <Embed-Dependency>*</Embed-Dependency>
                    <Embed-Transitive>true</Embed-Transitive>
                </instructions>
            </configuration>
        </plugin>
          <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <skipTests>${skipTests}</skipTests>
            </configuration>
          </plugin>
    </plugins>
</build>

これで依存関係が埋め込まれましたが、Karafはバンドルを開始できません。

28
gc5

ここには2つの選択肢があると思います。

Import-Package: com.google.gson;version="[2.3,3)"MANIFEST.MFがある場合、これは、一部のパッケージを、組み込みjarからではなく、デプロイされたバンドルからインポートすることを意味します。この場合、最初にgson-2.3.1.jarバンドルをデプロイし(このファイルをデプロイフォルダーにコピー)、次にバンドルをデプロイする必要があります。

Gsonライブラリを単純な非OSGi jar依存関係として埋め込む場合、これも実行できますが、そのパッケージをImport-Packageから除外する必要があります。

    <plugin>
        <groupId>org.Apache.felix</groupId>
        <artifactId>maven-bundle-plugin</artifactId>
        <extensions>true</extensions>
        <configuration>
            <instructions>
                <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
                <Import-Package>!com.google.gson,*</Import-Package>
                <Embed-Dependency>gson</Embed-Dependency>
            </instructions>
        </configuration>
    </plugin>
42
Sergei Petunin