java - 在 apache karaf 中安装时,apache camel 在 bundle 中 Unresolved 约束

标签 java xml apache maven apache-camel

我是 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>

最佳答案

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

现在,当您部署您的 bundle 时,必须满足 list 文件中的所有这些导入,否则您会遇到这些 bundle 连接异常。由于您的 pom.xml 中有 camel-core(更准确地说,因为您在 Java 代码中导入了 camel-core 类),您必须在 Karaf 中也存在这些类。你自己的类将在那个 bundle jar 中,因为你已经定义了:

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

Karaf 将提供 org.osgi.core,您无需自行安装。


解决方案 1:您可以通过将以下内容插入 Karaf 控制台来手动安装 camel-core:

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

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


解决方案 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。在此之后,您的 bundle 安装将成功。


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

关于java - 在 apache karaf 中安装时,apache camel 在 bundle 中 Unresolved 约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32458572/

相关文章:

python - 我的第一个网络应用程序 (Python) : use CGI, 还是像 Django 这样的框架?

java - 规则 : Null pointers should not be dereferenced 上的 Sonar 误报

java - SAX xml 解析器缺少行号

java - 使用 (XStream) 将对象序列化/反序列化为 XML

java - 如何添加评价我的应用程序弹出消息 android?

apache - Google SPDY - 有人在 Apache 上使用过它吗?

java - 如何在遗传算法中强制基因的依赖/关联?

java - Android 应用程序创建文件但找不到它

java - Log4JLoggerAdapter 处的 SLF4J NoSuchMethodError

php - 该网页在 php 中有重定向循环