Karaf + Camel + Maven + Docker

问题描述

我是 KarafCamel 的新手,我正在尝试部署自定义骆驼路线 (java),但在此期间我遇到了很多问题在热部署目录中部署骆驼包 (.jar)。

到目前为止我得到了什么:

  • Apache Karaf 4.3.1 在 docker 容器中运行
  • 将 .jar 与 java 定义的路由捆绑在一起

我的想法是将 /deploy 目录映射到 karaf 容器,以便部署添加到该目录的任何 .jar(或者可能为 karaf 构建新映像)。

当我尝试将当前包添加到目录时,我收到以下错误消息:

20:19:32.490 INFO [fileinstall-/opt/karaf/deploy] Installing bundle org.apache.karaf.examples.karaf-camel-example-java / 4.3.1
20:19:32.535 WARN [fileinstall-/opt/karaf/deploy] Error while starting bundle: file:/opt/karaf/deploy/karaf-camel-example-java-4.3.1.jar
org.osgi.framework.BundleException: Unable to resolve org.apache.karaf.examples.karaf-camel-example-java [111](R 111.0): missing requirement [org.apache.karaf.examples.karaf-camel-example-java [111](R 111.0)] osgi.wiring.package; (&(osgi.wiring.package=org.apache.camel)(version>=3.6.0)(!(version>=4.0.0))) Unresolved requirements: [[org.apache.karaf.examples.karaf-camel-example-java [111](R 111.0)] osgi.wiring.package; (&(osgi.wiring.package=org.apache.camel)(version>=3.6.0)(!(version>=4.0.0)))]
        at org.apache.Felix.framework.Felix.resolveBundleRevision(Felix.java:4368) ~[?:?]
        at org.apache.Felix.framework.Felix.startBundle(Felix.java:2281) ~[?:?]
        at org.apache.Felix.framework.BundleImpl.start(BundleImpl.java:998) ~[?:?]
        at org.apache.Felix.fileinstall.internal.DirectoryWatcher.startBundle(DirectoryWatcher.java:1260) [!/:3.6.8]
        at org.apache.Felix.fileinstall.internal.DirectoryWatcher.startBundles(DirectoryWatcher.java:1233) [!/:3.6.8]
        at org.apache.Felix.fileinstall.internal.DirectoryWatcher.doProcess(DirectoryWatcher.java:520) [!/:3.6.8]
        at org.apache.Felix.fileinstall.internal.DirectoryWatcher.process(DirectoryWatcher.java:365) [!/:3.6.8]
        at org.apache.Felix.fileinstall.internal.DirectoryWatcher.run(DirectoryWatcher.java:316) [!/:3.6.8]

我认为这可以通过 maven 包“包装”解决,但我不确定这是否正确,如果是,我应该如何包装包?

感谢阅读:D

解决方法

有点晚了,但希望这对某人有所帮助,因为我在过去一年中在探索 OSGi、Karaf、Camel 和 Docker 时对这个设置进行了相当多的调整。

如果您想使用 karaf 进行本地开发,您实际上可以将您的 Maven 存储库映射到容器,这可以使安装包和功能变得更加容易。

这是一个用于 karaf 4.2.11 的 docker-compose,但您可以毫无问题地将其更改为 4.3.1。 (如果使用 SELinux,请在卷上添加 :z)

version: "2.4"
services: 

  karaf-runtime: 
    container_name: karaf
    image: apache/karaf:4.2.11
    ports: 
      - 8101:8101
      - 8181:8181
      - 1098:1098      
    volumes: 
      - ./karaf/etc:/opt/apache-karaf/etc
      - ./karaf/deploy:/opt/apache-karaf/deploy
      - karaf-data:/opt/apache-karaf/data
      - ~/.m2:/root/.m2
      - karaf-history:/root/.karaf
    command: [ karaf,server ]

volumes: 
  karaf-data: 
  karaf-history: 

只需将其保存到某个空文件夹中的 docker-compose.yml 并在文件夹中使用以下命令启动和停止

# Start
docker-compose up -d

# Stop
docker-compose down

创建可安装到 karaf 的包的简单方法是在创建项目时使用官方原型 karaf-bundle-archetypekaraf-blueprint-archetype 之一。要在 karaf 中使用它们,您只需对它们运行 mvn clean install 将它们打包到本地存储库。

然后从 karaf 控制台您可以使用 maven 使用命令来安装包:bundle:install mvn:groupid/artifactId/version。当您进行更改时,您可以使用命令 bundle:update bundleId 从本地存储库更新包。

对于camel,您可以按照official guide 中有关如何添加camel 功能存储库和您需要的功能。

但是步骤基本上是:

# Add camel feature repo
feature:repo-add camel <version>

# Install camel feature
feature:install camel

# List available camel features for install
feature:list | grep camel

# Install camel features you need
feature:install <feature-name>

对于 Java-DSL,您可以使用 OSGiDefaultCamelContextDefaultCamelContext 或 Camel Main 类来运行您的路由。 OSGiDefaultCamelContextcamel-core-osgi 工件的一部分,它包含在骆驼版本 2.25.4 和更早版本的骆驼 3 的骆驼 scr 中,它可能包含在骆驼蓝图功能中,如果没有,那么您可以只安装个人捆绑。

您可以使用 OSGi 蓝图、捆绑激活器类或声明性服务注释来启动/停止 CamelContexts。还有其他方法,但这些方法使用底层 OSGi 框架。

安装包时,missing requirement 通常会告诉您该包所依赖的包在 karaf 中丢失,这意味着您必须安装导出所述包的包。

这些消息通常最好从结尾开始阅读:

(osgi.wiring.package=org.apache.camel)(version>=3.6.0)(!(version>=4.0.0)

这意味着您的 karaf 安装没有安装骆驼。 OSGi bundle 期望 OSGi 框架/运行时满足它们的依赖关系,这与独立的 SpringBoot 项目有很大不同。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...