【问题标题】:apache camel unresolved constraint in bundle when installing in apache karaf在 apache karaf 中安装时,捆绑包中的 apache camel 未解决约束
【发布时间】:2015-12-04 04:25:25
【问题描述】:

我是 Apache camel 的新手,刚刚尝试使用 RouteBuilder 构建一个路由,但是一旦我得到一个扩展 RouterBuilder 的类,当我尝试在 Apache karaf 中安装该捆绑包时出现此错误:

2015-09-08 14:54:49,227 | WARN  | raf-3.0.4/deploy | fileinstall
      | 7 - org.apache.felix.fileinstall - 3.5.0 | Error while starting bundle:
file:/C:/apache-karaf-3.0.4/deploy/osgi-1.0-SNAPSHOT.jar
org.osgi.framework.BundleException: Unresolved constraint in bundle osgi [91]: U
nable to resolve 91.0: missing requirement [91.0] osgi.wiring.package; (&(osgi.w
iring.package=org.apache.camel.builder)(version>=2.14.0)(!(version>=3.0.0)))
        at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:397
4)[org.apache.felix.framework-4.2.1.jar:]
        at org.apache.felix.framework.Felix.startBundle(Felix.java:2037)[org.apa
che.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(Di
rectoryWatcher.java:1245)[7:org.apache.felix.fileinstall:3.5.0]
        at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundles(D
irectoryWatcher.java:1217)[7:org.apache.felix.fileinstall:3.5.0]
        at org.apache.felix.fileinstall.internal.DirectoryWatcher.doProcess(Dire
ctoryWatcher.java:509)[7:org.apache.felix.fileinstall:3.5.0]
        at org.apache.felix.fileinstall.internal.DirectoryWatcher.process(Direct
oryWatcher.java:358)[7:org.apache.felix.fileinstall:3.5.0]
        at org.apache.felix.fileinstall.internal.DirectoryWatcher.run(DirectoryW
atcher.java:310)[7:org.apache.felix.fileinstall:3.5.0]

现在我只有这两个类

package osgi;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class Activator implements BundleActivator {

    public void start(BundleContext context) {
        System.out.println("Starting the bundle");
    }

    public void stop(BundleContext context) {
        System.out.println("Stopping the bundle");
    }

}

package osgi;

import org.apache.camel.builder.RouteBuilder;

public class TimerRouteBuilder extends RouteBuilder {

    @Override
    public void configure() throws Exception {
        // TODO Auto-generated method stub

    }

}

这是我的 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">

    <!--

        Licensed to the Apache Software Foundation (ASF) under one or more
        contributor license agreements.  See the NOTICE file distributed with
        this work for additional information regarding copyright ownership.
        The ASF licenses this file to You under the Apache License, Version 2.0
        (the "License"); you may not use this file except in compliance with
        the License.  You may obtain a copy of the License at

            http://www.apache.org/licenses/LICENSE-2.0

        Unless required by applicable law or agreed to in writing, software
        distributed under the License is distributed on an "AS IS" BASIS,
        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        See the License for the specific language governing permissions and
        limitations under the License.
    -->

    <modelVersion>4.0.0</modelVersion>

    <groupId>osgi</groupId>
    <artifactId>osgi</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>bundle</packaging>

    <name>osgi Bundle</name>
    <description>osgi OSGi bundle project.</description>

    <dependencies>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.core</artifactId>
            <version>4.2.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-core</artifactId>
            <version>2.14.3</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <version>2.3.7</version>
                <extensions>true</extensions>
                <configuration>
                    <instructions>
                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
                        <Bundle-Version>${project.version}</Bundle-Version>
                        <Bundle-Activator>osgi.Activator</Bundle-Activator>
                        <Export-Package>
                            osgi*;version=${project.version}
                        </Export-Package>
                        <Import-Package>
                            *
                        </Import-Package>
                    </instructions>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

【问题讨论】:

  • 91 号的 OSGI 捆绑包是什么?您是否已经检查了org.apache.camel.builder 的缺失要求?
  • 我只有一个 OSGi 包,它是由这 3 个部分组成的包 - 即编号为 91 的包。org.apache.camel.builder 位于我在 xml 中获得的骆驼核心依赖项中跨度>

标签: java xml apache maven apache-camel


【解决方案1】:

您在安装 Karaf 时缺少 camel-core 依赖项。如果您检查 osgi-1.0-SNAPSHOT.jar 包中的 META-INF/MANIFEST.MF 文件,您会看到 Import-Packages 部分中有一行写着 org.apache.camel.builder以及运行您的捆绑包所需的所有其他软件包。

现在,当您部署捆绑包时,必须满足清单文件中的所有这些导入,否则您会遇到捆绑包连接异常。由于您的 pom.xml 中有骆驼核心(更准确地说,因为您在 Java 代码中导入了骆驼核心类),所以这些类也必须存在于 Karaf 中。由于您已定义,您自己的类将在该捆绑 jar 中:

<Export-Package>
    osgi*;version=${project.version}
</Export-Package>

Karaf 会提供 org.osgi.core,你不必自己安装。


解决方案 1:您可以手动安装 camel-core,在 Karaf 控制台中插入以下内容:

feature:repo-add mvn:org.apache.camel.karaf/apache-camel/2.14.3/xml/features
feature:install camel-core

在此之后,您的包安装将成功。


解决方案 2:您可以创建 Karaf 存档 (.kar),它将所有所需的依赖项分组到一个您可以部署的文件中。创建新的 Maven 项目,结构如下:

.
├── pom.xml
└── src
    └── main
        └── feature
            └── feature.xml

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>
<groupId>com.example</groupId>
<artifactId>osgi-example-kar</artifactId>
<version>1.0-SNAPSHOT</version>

<packaging>kar</packaging>

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.karaf.tooling</groupId>
                <artifactId>karaf-maven-plugin</artifactId>
                <version>3.0.2</version>
                <extensions>true</extensions>
            </plugin>
        </plugins>
    </pluginManagement>
    <plugins>
        <plugin>
            <groupId>org.apache.karaf.tooling</groupId>
            <artifactId>karaf-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
</project>

而 feature.xml 是

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.1" name="osgi-example-features">
    <repository>mvn:org.apache.camel.karaf/apache-camel/2.14.3/xml/features</repository>

    <feature name="osgi-example-features" version="1.0-SNAPSHOT"
         description="Features for running simple OSGi example.">

        <feature version="2.14.3">camel-core</feature>
    </feature>
</features>

当您运行 mvn install 并将 target/*.kar 文件复制到 Karaf 部署文件夹时,Karaf 将为您安装 camel-core。在此之后,您的包安装将成功。


请注意,当您登录到 System.out 时,它不会出现在 Karaf 控制台日志中,因此不要期望在那里看到这些消息。您可以使用例如那里有 Log4j 记录器。

【讨论】:

    猜你喜欢
    • 2015-12-05
    • 2015-05-22
    • 2017-09-11
    • 2016-06-26
    • 2011-03-14
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 2014-05-04
    相关资源
    最近更新 更多