Intellij idea IDEA 10.5.2 Aspectj编译器-can';t确定缺少类型org.springframework.transaction.interceptor.TransactionSpectSupport的超类

Intellij idea IDEA 10.5.2 Aspectj编译器-can';t确定缺少类型org.springframework.transaction.interceptor.TransactionSpectSupport的超类,intellij-idea,aspectj,Intellij Idea,Aspectj,尝试使用spring特性制作一个模块给了我: 无法确定缺少类型org.springframework.transaction.interceptor.TransactionSpectSupport的超类 在其他模块中工作,这是怎么回事?失踪副局长 /不幸的是,在使用AspectJ开发时,这是一个经常发生的错误 通常,在任何java应用程序的类路径中,都有一些“死”类,即存在于某个jar中但从未使用过的类 这些类通常也会丢失它们的依赖项。例如,Velocity(仅举一个例子,但大多数库都是这样做的

尝试使用spring特性制作一个模块给了我:

无法确定缺少类型org.springframework.transaction.interceptor.TransactionSpectSupport的超类

在其他模块中工作,这是怎么回事?失踪副局长


/不幸的是,在使用AspectJ开发时,这是一个经常发生的错误

通常,在任何java应用程序的类路径中,都有一些“死”类,即存在于某个jar中但从未使用过的类

这些类通常也会丢失它们的依赖项。例如,Velocity(仅举一个例子,但大多数库都是这样做的)附带了类来桥接许多日志设施,如log4j、java日志等。。如果要使用其中一个,还需要包含它的依赖项(如log4j.jar),否则如果不使用它,就无法添加该依赖项

这本身在使用库时不是问题,因为这些类永远不会被加载。但是,当您使用AspectJ时,情况会发生一些变化

假设您有一个切入点,如:

execution(int MyClass+.getSomething())
虽然这个切入点看起来非常具体,但它表示“在MyClass的任何子类中都有一个名为getSomething的方法”。这意味着要知道某个类是否满足切入点,AspectJ必须在编织时检查所有超类

但是如果AspectJ试图在上面提到的“死类”上这样做,会发生什么呢?它将搜索超类并失败,因为该类未被使用,并且它的依赖关系未得到满足

我通常指示AspectJ在这种情况下只向我发出警告,而不是引发阻塞错误,因为10次中有9次这种情况发生在死代码上,可以安全地忽略

另一种方法是找出哪个切入点导致AspectJ检查该类,并尝试重写它,以便范围更严格。然而,这并不总是可能的

一个肮脏但快速的黑客可能是这样写的:

execution(... MyClass+ ....) && !this(org.springframework.....)
这是(通常)由AspectJ优化的,因此!在尝试评估完整的执行切入点之前,(..)失败。。但它将切入点与特定情况联系在一起,因此只有在寻找更好的解决方案的同时,在测试最后一秒修补正在运行的系统时才有用


在这种情况下,应该受到责备的不是AspectJ,而是包含死类的库,死类可以(也应该)放在单独的模块中。许多库不这样做是为了避免“模块扩散”(比如,每个库应该为每个日志系统发布单个模块等等),这是一个很好的论据,但可以通过最新的模块管理系统(如Maven、Ivy等)轻松解决而不是将一个jar文件打包成一大堆具有未满足依赖项的类,然后在文档中声明需要依赖项来加载该类

来自spring方面的AbstractTransactionSpect引用了来自spring tx的TransactionSpect支持-您在deps中有吗?

您需要添加spring tx依赖项以清除此问题:


org.springframework
德克萨斯州春季
${spring.version}

我刚刚通过清理maven解决了一个类似的问题


错误消息几乎相同,但与我自己的类有关。因此,我认为Simone Gianni的答案应该是正确的,IDE由于某些原因生成了一些不正确的类,所以只要删除它们就可以了。

添加可选的依赖项,如果在运行时实际不需要:

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-tx</artifactId>
  <optional>true</optional>
</dependency>

org.springframework

更改为
警告
(或
忽略
)。

是否有需要检查的日志?控制台里没什么,问题又来了。解决方法:使用maven构建;切换到javac和build,切换回ajc。不过我还是希望看到一个解决方案,最终解决了所有模块也被编译所需的spring方面和spring TXLEVEN链接到InIDEA用户论坛。
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-tx</artifactId>
  <optional>true</optional>
</dependency>