Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 迁移到事务api 1.2时Mule/Spring类加载器问题_Java_Spring_Mule_Classloader - Fatal编程技术网

Java 迁移到事务api 1.2时Mule/Spring类加载器问题

Java 迁移到事务api 1.2时Mule/Spring类加载器问题,java,spring,mule,classloader,Java,Spring,Mule,Classloader,我正在尝试迁移到事务api 1.2而不是JTA1.1 虽然我知道我可以调整mule提供的libs,但我不明白为什么仅仅将事务api添加到application/lib文件夹中应用程序就不能工作。没有事务api,一切正常,但有了它,我得到了: Caused by: java.lang.ClassNotFoundException: javax.transaction.Transactional at java.net.URLClassLoader.findClass(URLClassLoader.

我正在尝试迁移到事务api 1.2而不是JTA1.1

虽然我知道我可以调整mule提供的libs,但我不明白为什么仅仅将事务api添加到application/lib文件夹中应用程序就不能工作。没有事务api,一切正常,但有了它,我得到了:

Caused by: java.lang.ClassNotFoundException: javax.transaction.Transactional
at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[?:1.8.0_66]
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[?:1.8.0_66]
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[?:1.8.0_66]
at org.springframework.transaction.annotation.JtaTransactionAnnotationParser.parseTransactionAnnotation(JtaTransactionAnnotationParser.java:42) ~[spring-tx-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.data.repository.core.support.TransactionalRepositoryProxyPostProcessor$CustomAnnotationTransactionAttributeSource.determineTransactionAttribute(TransactionalRepositoryProxyPostProcessor.java:229) ~[?:?]
at org.springframework.data.repository.core.support.TransactionalRepositoryProxyPostProcessor$CustomAnnotationTransactionAttributeSource.findTransactionAttribute(TransactionalRepositoryProxyPostProcessor.java:208) ~[?:?]
at org.springframework.data.repository.core.support.TransactionalRepositoryProxyPostProcessor$AbstractFallbackTransactionAttributeSource.computeTransactionAttribute(TransactionalRepositoryProxyPostProcessor.java:397) ~[?:?]
at org.springframework.data.repository.core.support.TransactionalRepositoryProxyPostProcessor$AbstractFallbackTransactionAttributeSource.getTransactionAttribute(TransactionalRepositoryProxyPostProcessor.java:345) ~[?:?]
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:270) ~[spring-tx-4.2.4.RELEASE.jar:4.2.4.RELEASE]
下面是一些与Spring代码相关的狙击手

spring数据共享空间
(应用程序/lib):

其中:

        private static final boolean jta12Present = ClassUtils.isPresent("javax.transaction.Transactional",
            CustomAnnotationTransactionAttributeSource.class.getClassLoader());
-在将事务api添加到应用程序时,似乎通过了此检查

JtaTransactionAnnotationParser
来自mule提供的spring tx(mule\U HOME\lib\opt)。这是它抛出异常的地方:

public class JtaTransactionAnnotationParser implements TransactionAnnotationParser, Serializable {
    @Override
    public TransactionAttribute parseTransactionAnnotation(AnnotatedElement ae) {
        AnnotationAttributes attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(ae, javax.transaction.Transactional.class); - ClassNotFoundException

为什么Spring可以在一个地方识别事务,但不能在另一个地方识别事务?看起来SpringDataCommons和SpringTX在不同的范围内可能是原因,但我不明白为什么,因为Mule应该提供复杂的分层类加载器结构,并在整个层次结构中进行搜索

好了,我想我现在更明白了。正如我在问题的最后所建议的,这是一个与类加载器相关的问题。但是,它不是Mule或Spring特有的。这是一个简单的旧类加载器可见性原则:

可见性原则允许子类加载器查看所有类 由父类加载器加载,但父类加载器无法看到 子类加载的类

在我的例子中,两个依赖的spring库最终被单独的类加载器加载。这就是为什么我强烈建议在向应用程序添加任何具有
compile
作用域的库之前,检查
提供的
依赖关系。如果无法避免歧义,可以选择管理类加载器优先级(父级优先vs父级最后)

public class JtaTransactionAnnotationParser implements TransactionAnnotationParser, Serializable {
    @Override
    public TransactionAttribute parseTransactionAnnotation(AnnotatedElement ae) {
        AnnotationAttributes attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(ae, javax.transaction.Transactional.class); - ClassNotFoundException