我决定在OSGI和Karaf之上构建一个应用程序 - 我真的很喜欢这个东西.但是,我在本地开发机器上进行日常部署时遇到了一些困难.我的意思是..我做了一个改变,然后我想在我当地的Karaf实例上进行测试.它可能发生在每小时几次.
我现在这样做的方式是创建一个JAR包的maven构建,然后将其复制到Karaf的deploy目录中.我认为它根本不优雅.
我试图寻找一种方法(谷歌).我读到了Karaf的功能,但似乎尽管它是一个很好的机制来部署整个应用程序,但它并没有解决我的问题.据我所知,它不会检查我的SNAPSHOT jar的新版本是否出现在我当地的maven回购中,对吗?
我正在尝试使用StatelessSession在OSGi环境中进行一些批量插入(Karaf 4.0.7),但是当我尝试提交我的事务时,我得到了
be.ikan.lib.orm.base.exceptions.PersistenceBrokerException: org.hibernate.TransactionException: Cannot retrieve the TransactionManager OSGi service!
at be.ikan.lib.orm.hibernate.broker.HibernateStatelessPersistenceBrokerImpl.commitTransaction(HibernateStatelessPersistenceBrokerImpl.java:118)[79:be.ikan.lib.orm:7.0.0]
at be.ikan.scm4all.business.server.bs.pack.PackageServiceImpl.createLevelRequestFileRevisionAssociations(PackageServiceImpl.java:1412)[72:be.ikan.scm4all.daemons.server:5.8.0]
at be.ikan.scm4all.phases.core.level.LinkFileRevisionsPhase.execute(LinkFileRevisionsPhase.java:99)[72:be.ikan.scm4all.daemons.server:5.8.0]
at Proxy5a8c2944_a0d5_4e21_a1b7_3f30296f5993.execute(Unknown Source)[:]
at be.ikan.scm4all.phases.impl.DefaultPhaseExecutionImpl.execute(DefaultPhaseExecutionImpl.java:152)[114:be.ikan.scm4all.daemons.shared:5.8.0]
at be.ikan.scm4all.daemons.server.monitor.MonitorThread.run(MonitorThread.java:231)[72:be.ikan.scm4all.daemons.server:5.8.0]
Caused by: org.hibernate.TransactionException: Cannot retrieve the TransactionManager OSGi service!
at org.hibernate.osgi.OsgiJtaPlatform.retrieveTransactionManager(OsgiJtaPlatform.java:51)[62:org.hibernate.osgi:5.2.17.Final]
at org.hibernate.osgi.OsgiJtaPlatform.getCurrentStatus(OsgiJtaPlatform.java:98)[62:org.hibernate.osgi:5.2.17.Final]
at org.hibernate.internal.StatelessSessionImpl.flushBeforeTransactionCompletion(StatelessSessionImpl.java:667)[60:org.hibernate.core:5.2.17.Final]
at org.hibernate.internal.StatelessSessionImpl.beforeTransactionCompletion(StatelessSessionImpl.java:644)[60:org.hibernate.core:5.2.17.Final]
at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:473)[60:org.hibernate.core:5.2.17.Final]
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:156)[60:org.hibernate.core:5.2.17.Final]
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$100(JdbcResourceLocalTransactionCoordinatorImpl.java:38)[60:org.hibernate.core:5.2.17.Final]
at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:231)[60:org.hibernate.core:5.2.17.Final]
at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:68)[60:org.hibernate.core:5.2.17.Final]
at be.ikan.lib.orm.hibernate.broker.HibernateStatelessPersistenceBrokerImpl.commitTransaction(HibernateStatelessPersistenceBrokerImpl.java:114)[79:be.ikan.lib.orm:7.0.0]
... 5 more
Caused by: org.hibernate.TransactionException: Cannot retrieve the TransactionManager OSGi service!
at org.hibernate.osgi.OsgiJtaPlatform.retrieveTransactionManager(OsgiJtaPlatform.java:46)[62:org.hibernate.osgi:5.2.17.Final]
Run Code Online (Sandbox Code Playgroud)
我不使用JTA来管理我的事务,我设置了hibernate.transaction.coordinator_class = jdbc.使用常规Sesssion的代码运行正常.应用程序的另一部分在非OSGi环境中运行,并且StatelessSession可以正常工作.
我将它跟踪到Hibernate源代码中,并在org.hibernate.internal.StatelessSessionImpl中找到:
@Override
public void flushBeforeTransactionCompletion() {
boolean flush = false;
try …Run Code Online (Sandbox Code Playgroud) 我正在开发一个OSGI包,用于使用PDFBox库解析PDF文件.我使用maven构建项目,使用Karaf作为OSGI容器.PDFBox库与OSGI兼容,所以我认为这很容易.但我无法正确获得部署模型.
在传统的Web应用程序中,我将构建一个包含所有依赖项的WAR文件,并将其放在Servlet容器中,然后部署它.另一方面,我想出如何安装osgi包的唯一方法是手工完成.我必须创建一个安装指令文件,列出必须手动下载并复制到Karaf部署文件夹的所有依赖项,并确保按正确的顺序执行.我觉得自己又回到了石器时代.
必须有一个更简单的方法,对吧?我仍然使用maven来声明依赖项,但我只需要使用提供的范围.如果可以自动安装这些依赖项,那将会很棒.
我正在使用maven-bundle-plugin从我的应用程序生成一个包.它确实生成了一个OBR存储库(repository.xml),我尝试使用obr karaf插件安装我的软件包,但它仍然无法帮助依赖.
我需要以非交互方式发出Karaf shell命令,最好是从脚本中发出.更具体地说,我需要以feature:install自动方式告诉Karaf 一系列功能.
# Attempt to install a feature in a way I could script
bash> bin/karaf feature:install myFeature
# Drops me into Karaf shell
karaf> feature:uninstall myFeature
Error executing command: Feature named 'myFeature' is not installed
# Feature wasn't installed
Run Code Online (Sandbox Code Playgroud)
这可能吗?是否有一种不同的解决方法(自动安装一套Karaf功能)我不知道?
我使用$KARAF_HOME/bin/startCentOS 6.5 在服务器模式下启动了Apache Karaf 3.0.0 .然后我想运行几个命令$KARAF_HOME/bin/client并捕获这些命令的输出,以确保命令成功运行.输出确实在我的控制台上吐出,但我永远无法将其重定向到文件中.好像Karaf没有向输出流或错误流写任何内容.我尝试了以下方法:
[apache-karaf-3.0.0]$ ./bin/start clean
[apache-karaf-3.0.0]$ ./bin/client "bundle:list"
Logging in as karaf
282 [pool-2-thread-3] WARN org.apache.sshd.client.keyverifier.AcceptAllServerKeyVerifier - Server at /0.0.0.0:8101 presented unverified key:
START LEVEL 100 , List Threshold: 50
ID | State | Lvl | Version | Name
------------------------------------------------------------------------------------
91 | Active | 80 | 1.8.0 | Commons Codec
92 | Active | 80 | 2.6 | Commons Lang
93 | Active | 80 | 15.0.0 | Guava: Google Core Libraries …Run Code Online (Sandbox Code Playgroud) 我被要求调试在我的开发机器上托管的VM中运行的Apache Karaf(OSGi)中安装的Java应用程序。我的同事已经能够使用Eclipse成功进行远程调试。我选择的工具是IntelliJ,并且在尝试远程调试时,IntelliJ成功(通过套接字)连接。如果我暂停调试会话,Karaf控制台将按预期冻结,并在单击继续时恢复。但是当我暂停时,我可以在IntelliJ中看到以下消息,并且我的断点将被忽略。
目标VM不会因断点请求而暂停。在这种模式下无法评估方法。
这是什么意思?我已经搜索并浏览了IntelliJ的文档。为什么Eclipse可以允许工作断点而IntelliJ不允许呢?
我有一个数据源功能,可以将数据源导出为 OSGi 服务:
> services -p 2038
OPS4J Pax JDBC Config (2038) provides:
--------------------------------------
objectClass = [org.osgi.service.cm.ManagedServiceFactory]
service.bundleid = 2038
service.id = 211
service.pid = org.ops4j.datasource
service.scope = singleton
----
databaseName = foobar
dataSourceName = fooDatasource
felix.fileinstall.filename = file:/home/foousr/apache-karaf-4.0.6/etc/org.ops4j.datasource-foo.cfg
objectClass = [javax.sql.DataSource]
osgi.jndi.service.name = fooDatasource
service.bundleid = 2038
service.factoryPid = org.ops4j.datasource
service.id = 251
service.pid = org.ops4j.datasource.b3020619-71b9-4876-94c3-477f3e4a503d
service.scope = singleton
url = jdbc:oracle:thin:@dbserver:99999/foo
user = FOOUSR
Run Code Online (Sandbox Code Playgroud)
作为创建和注册此数据源服务的 ds-feature 的一部分,它还包含一个 ping-ds 包,我可以用它来测试数据源:
> jdbc:ping-ds fooDatasource
Ping from localhost(127.0.0.1) as FOOUSR to …Run Code Online (Sandbox Code Playgroud) 我正在org.apache.jena与karaf. 在尝试查询我的模型时,我NullPointerException打印了用于创建查询的所有变量,而 all( queryString, inferedModel) 不是null。这是我的代码的样子:
Model model = JenaEngine.readModel(inputDataOntology);
if (model == null) {
return "model null !";
}
Model inferedModel = JenaEngine.readInferencedModelFromRuleFile(model, inputRule);
if (inferedModel == null) {
return "inferedModel null !";
}
JenaEngine.updateValueOfDataTypeProperty(inferedModel, ns, "Peter", "age", 10);
JenaEngine.updateValueOfObjectProperty(inferedModel, ns, "Peter", "estFilsDe", "Femme1");
JenaEngine.createInstanceOfClass(model, ns, "Femme", "abc");
//query on the model
String prefixQuery = "PREFIX ns: <http://www.owl-ontologies.com/Ontology1291196007.owl#>\n" +
"PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n" +
"PREFIX owl: <http://www.w3.org/2002/07/owl#>\n"+
"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n"; …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建自己的 Karaf shell 命令,并且我愿意使用 Gradle 来执行此操作,因为整个项目都在 Gradle 上。
到目前为止,我找到的唯一相关文档是 http://karaf.apache.org/manual/latest/#_shell_commands ,它说
See [examples/karaf-command-example] to add your own shell commands.
Run Code Online (Sandbox Code Playgroud)
示例是使用 MAVEN 创建的,并且绝对没有描述那里发生了什么魔法以及结果包中应该出现什么,以便我可以在 Gradle 中重现它。
有人可以告诉如何在 Gradle 项目中实现相同的目标吗?
Karaf 如何识别 Bundle 中存在哪些命令?
不幸的是,被称为Karaf的OSGi容器实现的文献资料很少。刷过概念,没有建立术语之间的关系。
阅读Karaf开发人员撰写的文字后得出的结论(我想是吗?):
当OSGi容器中其他捆绑软件(我称为依赖项)不可用时,“前提条件”不允许启动我的“特殊服务器”捆绑软件。
依赖项是相同的
这两个都不会导致Karaf自动获取并启动那些依赖项
根据文档https://karaf.apache.org/manual/latest/provisioning的要求,将导致Karaf自动获取并启动那些依赖项/先决条件/要求。
features.xml开发人员可以在自己的存储库中了解从何处获取依赖项/先决条件/要求,但不会自动将其添加到Karaf中。
请填写我。
这里是我的,我跑通过features.xml的例子maven-resources-plugin的copy-resources这样的插值目标${var}小号出现。
<?xml version="1.0" encoding="UTF-8"?>
<features xmlns="http://karaf.apache.org/xmlns/features/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.0.0 http://karaf.apache.org/xmlns/features/v1.0.0"
name="special-server-features">
<!-- Special Server -->
<feature name="special-server" version="1.0.0" install="auto" resolver="(obr)">
<details>
A feature is just a group of bundles that should all be installed together.
When an OSGi container adds a bundle, it goes through a resolution process
to make sure that the bundle’s dependencies are met (and that it does not
conflict with …Run Code Online (Sandbox Code Playgroud) karaf ×10
apache-karaf ×5
osgi ×4
java ×2
maven ×2
breakpoints ×1
debugging ×1
gradle ×1
hibernate ×1
installation ×1
jena ×1
jta ×1
osgi-bundle ×1
scripting ×1
shell ×1