问题描述
我是 Karaf 和 Camel 的新手,我正在尝试部署自定义骆驼路线 (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-archetype
或 karaf-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,您可以使用 OSGiDefaultCamelContext
、DefaultCamelContext
或 Camel Main 类来运行您的路由。 OSGiDefaultCamelContext
是 camel-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 项目有很大不同。