Jboss7.x JBoss AS 7下的AspectJ Aspect抛出Xlint:InvalidaBSolutionPename
我有一套在JBoss 6.1.0.Final上运行没有问题的WAR,它们使用AspectJ 1.6.12和Spring 3.1.2.RELEASE,使用Maven构建。我们希望在不久的将来转向JBossAS7,因此我从源代码处编译了JBoss7.1.3.Final 在我遇到单个WAR文件的问题后,我决定将应用程序重新打包为EAR文件,因此我们所有的代码都将放在一个可重新分发、可部署的单元中 我很难让我们的分析功能正常工作。这是一个非常简单的方面,包含在我们的EAR/lib目录中的JAR中,它对使用@Timed注释的任何方法都是有效的:Jboss7.x JBoss AS 7下的AspectJ Aspect抛出Xlint:InvalidaBSolutionPename,jboss7.x,aspectj,spring-aop,Jboss7.x,Aspectj,Spring Aop,我有一套在JBoss 6.1.0.Final上运行没有问题的WAR,它们使用AspectJ 1.6.12和Spring 3.1.2.RELEASE,使用Maven构建。我们希望在不久的将来转向JBossAS7,因此我从源代码处编译了JBoss7.1.3.Final 在我遇到单个WAR文件的问题后,我决定将应用程序重新打包为EAR文件,因此我们所有的代码都将放在一个可重新分发、可部署的单元中 我很难让我们的分析功能正常工作。这是一个非常简单的方面,包含在我们的EAR/lib目录中的JAR中,它对使
package com.mycompany.toplayer.perf;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class MethodTimerAdvice {
private Logger log = LoggerFactory.getLogger(getClass());
@SuppressWarnings("unchecked")
@Around(value="execution(@com.mycompany.toplayer.perf.Timed * *(..))")
public Object timeMethod(ProceedingJoinPoint pjp) throws Throwable
{
String methodName = pjp.getSignature().toShortString();
long start = System.currentTimeMillis();
Object ret = pjp.proceed();
long end = System.currentTimeMillis();
long total = end - start;
long used_mem = Runtime.getRuntime().totalMemory()
- Runtime.getRuntime().freeMemory();
long mem_gb = used_mem / (1024 * 1024);
log.trace("{} | {} | {}M | {} | {} | {}",
new Object[] {start, total,
mem_gb,
Thread.currentThread().getId(),
Thread.currentThread().getName(),
methodName}
);
return ret;
}
}
请注意,注释在同一个包中。这是该方面的相关Spring配置文件,同样非常简单:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package="com.mycompany" />
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
我还尝试将AspectJ作为一个模块,下面是EAR附带的jboss-deployment-structure.xml文件
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
<deployment>
<exclusions>
<module name="org.hibernate" slot="main"/>
</exclusions>
</deployment>
<sub-deployment name="gdm-updater-1.2.0-SNAPSHOT.war">
<exclusions>
<module name="org.hibernate" slot="main"/>
</exclusions>
<dependencies>
<module name="org.aspectj.tools" slot="main" />
<module name="org.aspectj.weaver" slot="main" />
</dependencies>
</sub-deployment>
</jboss-deployment-structure>
我甚至尝试使用gdm-updater.war中的Maven AspectJ编译器插件在gdm updater中进行编译时编织。war的pom.xml:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.4</version>
<configuration>
<showWeaveInfo>true</showWeaveInfo>
<source>${compiler.version}</source>
<target>${compiler.version}</target>
<Xlint>ignore</Xlint>
<complianceLevel>${compiler.version}</complianceLevel>
<encoding>UTF-8</encoding>
<verbose>false</verbose>
<aspectLibraries>
<aspectLibrary>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
</plugin>
org.codehaus.mojo
-不相关,因为我没有使用加载时编织
-不相关,因为我没有使用加载时编织或AspectJ作为Java代理
我已经考虑过加载时编织,但所讨论的方面很快将被扩展,以包括“公共”jar文件其余部分中的一些特性,我无法将其扩展到引导类路径。这意味着每次我们有一个新的方面,我们必须重新配置服务器
我做错了什么?对我来说,这在很大程度上“起作用”。我有一个例子,我一直在使用JBossAS7测试简单的方面,而没有加载时间编织
不适用于我的部分是,如果我指定了这样的对象:
Caused by: java.lang.IllegalArgumentException: warning no match for this type name: Timed [Xlint:invalidAbsoluteTypeName]
at org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:301) [aspectjtools.jar:]
at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:207) [spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at org.springframework.aop.aspectj.AspectJExpressionPointcut.getFallbackPointcutExpression(AspectJExpressionPointcut.java:358) [spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at org.springframework.aop.aspectj.AspectJExpressionPointcut.getShadowMatch(AspectJExpressionPointcut.java:409) [spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at org.springframework.aop.aspectj.AspectJExpressionPointcut.matches(AspectJExpressionPointcut.java:272) [spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:226) [spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:264) [spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at org.springframework.aop.support.AopUtils.findAdvisorsThatCanApply(AopUtils.java:296) [spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findAdvisorsThatCanApply(AbstractAdvisorAutoProxyCreator.java:117) [spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findEligibleAdvisors(AbstractAdvisorAutoProxyCreator.java:87) [spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean(AbstractAdvisorAutoProxyCreator.java:68) [spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:359) [spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:322) [spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:407) [spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.postProcessObjectFromFactoryBean(AbstractAutowireCapableBeanFactory.java:1598) [spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE]
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:162) [spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE]
... 28 more
<jee:jndi-lookup id="dataSource" jndi-name="jboss/datasources/ExampleDS"/>
这有问题,因为JBoss内部模块是用ModuleClassLoader加载的,它只对特定模块可见。然而,Aspect-J试图检查我的方面,但失败了,因为特定的类加载器没有加载我的方面类。这和我的想法是一样的
解决方法是依赖module.xml/jboss-deployment-structure.xml中的jdbc内部构件:
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
<deployment>
<dependencies>
<module name="org.jboss.ironjacamar.jdbcadapters"/>
</dependencies>
</deployment>
</jboss-deployment-structure>
如果使用调试器,可以连接异常java.lang.IllegalArgumentException并检查它使用的是哪个类加载器,以及它试图从调用堆栈中加载的类。我就是这么做的
我发现的另一个解决方法是直接在代码中而不是在Spring上下文中进行JNDI查找。这也行得通
我也开始讨论这个问题
更新:问题已在JBoss端被拒绝。他们声称这是AspectJ上的一个问题。我还打开了一个,对此没有任何评论。我也遇到了同样的问题。我已经通过将SpringAOP库的版本降级到3.0.7.0版本解决了这个问题。当然,这只是暂时的解决办法,我正在等待这个问题的真正原因。我在这里至少找到了部分解决办法
这个问题似乎随时都会出现,需要通知加载核心JBoss模块的类加载器加载的内容…最近,从JBoss EAP 6.4.8升级到6.4.9时,我们遇到了类似的问题
JNDI数据源的数据源实现似乎已从org.jboss.jca.adapters.jdbc.WrapperDataSource
更改为org.jboss.as.connector.subsystem.DataSources.WildFlyDataSource
我们在应用程序的jboss deployment structure.xml
文件中添加了以下部署依赖项,为我们解决了这个问题
<module name="org.jboss.as.connector" slot="main"/>
我看到这个问题被拒绝了。至少谢谢你的努力@布拉德:没问题。我更新了答案,也参考了aspect-j错误报告。
<jee:jndi-lookup id="dataSource" jndi-name="some_jndi_name" proxy-interface="javax.sql.DataSource" />