org.apache.aries.transaction.blueprint / 1.1.1无法获取javax.transaction.TransactionManager

时间:2017-03-22 10:22:28

标签: maven karaf aries

我使用karaf-maven-plugin创建了maven发行版。

我使用

创建了maven项目
  

mvn archetype:generate -DarchetypeGroupId = org.apache.karaf.archetypes   -DarchetypeArtifactId = karaf-assembly-archetype -DarchetypeVersion = 4.1.0

然后我添加了以下功能:

                <bootFeatures>
                    <feature>standard</feature>
                    <feature>jpa/2.5.0</feature>
                    <feature>transaction-api/1.2.0</feature>
                    <feature>transaction</feature>
                    <feature>eclipselink</feature>
                    <feature>pax-jdbc-config</feature>
                    <feature>pax-jdbc-postgresql</feature>
                </bootFeatures>

当我从Apache站点下载karaf 4.1.0发行版,并使用feature:install安装功能时,一切正常,但是,在插件构建的发行版中我收到错误:

  

无法启动捆绑包的蓝图容器   由于未解决,org.apache.aries.transaction.blueprint / 1.1.1   依赖[(objectClass = javax.transaction.TransactionManager)]   java.util.concurrent.TimeoutException at   org.apache.aries.blueprint.container.BlueprintContainerImpl $ 1.run(BlueprintContainerImpl.java:371)   [15:org.apache.aries.blueprint.core:1.7.1] at   org.apache.aries.blueprint.utils.threading.impl.DiscardableRunnable.run(DiscardableRunnable.java:48)   [15:org.apache.aries.blueprint.core:1.7.1] at   java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:511)   [?:?]在java.util.concurrent.FutureTask.run(FutureTask.java:266)   [?:?] 在   java.util.concurrent.ScheduledThreadPoolExecutor中的$ ScheduledFutureTask.access $ 201(ScheduledThreadPoolExecutor.java:180)   [?:?] 在   java.util.concurrent.ScheduledThreadPoolExecutor中的$ ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)   [?:?] 在   java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)   [?:?] 在   java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:617)   [?:?]在java.lang.Thread.run(Thread.java:745)[?:?]

     

2017-03-22T11:03:51,401 |错误|蓝图扩展器:1 |   BlueprintContainerImpl | 15 -   org.apache.aries.blueprint.core - 1.7.1 |无法启动蓝图   bundle org.apache.aries.transaction.blueprint / 2.1.0到期的容器   未解决的依赖关系   [(objectClass的=使用javax.transaction.TransactionManager)]   java.util.concurrent.TimeoutException at   org.apache.aries.blueprint.container.BlueprintContainerImpl $ 1.run(BlueprintContainerImpl.java:371)   [15:org.apache.aries.blueprint.core:1.7.1] at   org.apache.aries.blueprint.utils.threading.impl.DiscardableRunnable.run(DiscardableRunnable.java:48)   [15:org.apache.aries.blueprint.core:1.7.1] at   java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:511)   [?:?]在java.util.concurrent.FutureTask.run(FutureTask.java:266)   [?:?] 在   java.util.concurrent.ScheduledThreadPoolExecutor中的$ ScheduledFutureTask.access $ 201(ScheduledThreadPoolExecutor.java:180)   [?:?] 在   java.util.concurrent.ScheduledThreadPoolExecutor中的$ ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)   [?:?] 在   java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)   [?:?] 在   java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:617)   [?:?]在java.lang.Thread.run(Thread.java:745)[?:?]

我在Web控制台的OSGi注册表中找到了该服务:

Service 266 - [org.apache.aries.transaction.AriesTransactionManager, javax.transaction.TransactionManager, javax.transaction.TransactionSynchronizationRegistry, javax.transaction.UserTransaction, org.apache.geronimo.transaction.manager.RecoverableTransactionManager] (pid: n/a)
  from Bundle 143 - Apache Aries Transaction Manager (org.apache.aries.transaction.manager), version 1.3.2
    service.bundleid: 143
    service.scope: singleton

这里有什么问题? maven插件做错了什么,或问题是,该插件使用不稳定版本的工件?

1 个答案:

答案 0 :(得分:1)

如果不查看OSGi捆绑包的连线,就无法确定,但最可能的解释是有毒的javax.transaction包。在指定JTA时,很明显“核心Java”中的某些类型需要实现某些JTA接口,例如SQL Connection对象需要相关的XAResource。这迫使一些JTA API进入核心Java,但不是将完整的API放入基本运行时,只添加了几种类型。这导致Java Runtime和JTA之间的拆分包,并导致模块化系统出现大问题(通常不允许您同时从多个源看到相同的包。

在这种情况下,事务管理器服务必须使用OSGi框架内部署的捆绑包中的JTA API(基本运行时不包括TransactionManager接口)。另一方面,消费包可能从系统包(即Java运行时)导入javax.transaction。由于这两个捆绑包不共享服务API的视图,因此无法共享OSGi服务。

解决此问题的唯一真正方法是将JTA API放在Java类路径上,并使用启动属性通过系统包以正确的版本公开它,例如:

org.osgi.framework.system.packages.extra=javax.transaction;version=1.2