2017-03-22 16 views
1

karaf-maven-plugin을 사용하여 maven 배포판을 만들었습니다.org.apache.aries.transaction.blueprint/1.1.1은 javax.transaction.TransactionManager를 얻을 수 없습니다.

나는

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

나는 추가 한 다음과 같은 기능을 사용하여 Maven 프로젝트를 만들었습니다

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

나는이 기능을 사용하여 기능을 아파치 사이트에서 4.1.0 유통 karaf 다운로드 및 설치 : install, 모든 것이 잘 작동하지만, 플러그인으로 빌드 된 배포판에서 오류가 발생합니다 :

Unable to start blueprint container for bundle org.apache.aries.transaction.blueprint/1.1.1 due to unresolved dependencies [(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) [?:?] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:?] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [?:?] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [?:?] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:?] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:?] at java.lang.Thread.run(Thread.java:745) [?:?]

2017-03-22T11:03:51,401 | ERROR | Blueprint Extender: 1 | BlueprintContainerImpl | 15 - org.apache.aries.blueprint.core - 1.7.1 | Unable to start blueprint container for bundle org.apache.aries.transaction.blueprint/2.1.0 due to unresolved dependencies [(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) [?:?] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:?] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [?:?] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [?:?] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:?] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:?] at java.lang.Thread.run(Thread.java:745) [?:?]

웹 콘솔의 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

OSGi 번들의 배선을 보지 않아도 확실하지는 않지만 가장 유력한 설명은 독성이있는 javax.transaction 패키지입니다. JTA를 지정할 때 "핵심 자바"의 특정 유형이 특정 JTA 인터페이스를 구현하는 데 필요하다는 것을 알게되었습니다. 예를 들어 SQL Connection 객체에는 관련 XAResource이 필요합니다. 이로 인해 JTA API 중 일부가 코어 Java로 변경되었지만 전체 API를 기본 런타임에 추가하는 대신 몇 가지 유형이 추가되었습니다. 이로 인해 Java Runtime과 JTA 사이에 분할 패키지가 생기고 모듈러 시스템에서 큰 문제가 발생합니다. 일반적으로 여러 소스에서 동일한 패키지를 볼 수는 없습니다.

이 경우 트랜잭션 관리자 서비스는 (기본 런타임에는 TransactionManager 인터페이스가 포함되지 않음) OSTAi 프레임 워크 내부에 배포 된 번들에서 JTA API를 사용하고 있습니다. 반면에 소비 번들은 시스템 번들 (예 : Java 런타임)에서 javax.transaction을 가져 오는 중일 수 있습니다. 이 두 번들은 서비스 API를 공유하지 않으므로 OSGi 서비스를 공유 할 수 없습니다.

이 문제를 해결하는 유일한 방법은 JTA API를 Java 클래스 경로에 배치하고 시스템 번들을 통해 노출시키는 것입니다. 에이 다음과 같은 실행 속성을 사용하는 올바른 버전 :

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