【问题标题】:IDEA 10.5.2 Aspectj compiler - can't determine superclass of missing type org.springframework.transaction.interceptor.TransactionAspectSupportIDEA 10.5.2 Aspectj 编译器 - 无法确定缺少类型 org.springframework.transaction.interceptor.TransactionAspectSupport 的超类
【发布时间】:2011-09-08 10:17:20
【问题描述】:

尝试使用 spring 方面制作模块给了我:

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

在其他模块中工作,这个是怎么回事?缺少部门?

/S

【问题讨论】:

    标签: intellij-idea aspectj


    【解决方案1】:

    不幸的是,在使用 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 优化,因此 !this(....) 在尝试评估完整的执行切入点之前失败.. 但它会将您的切入点与特定情况联系起来,因此仅用于测试最后一秒修补正在运行的系统,同时寻找更好的解决方案。

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

    【讨论】:

    • 是否有任何日志可以检查某处?控制台不多
    • 嗯,问题又来了。解决方法:使用 Maven 构建;切换到 javac 并构建,切换回 ajc。我仍然希望看到解决方案
    • 终于解决了所有需要编译的模块都需要spring-aspects和spring-tx
    【解决方案2】:

    你需要添加 spring-tx 依赖来清除它:

    http://mvnrepository.com/artifact/org.springframework/spring-tx

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring.version}</version>
        </dependency>
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        来自 spring-aspects 的 AbstractTransactionAspect 引用了来自 spring-tx 的 TransactionAspectSupport - 你在 deps 中有它吗?

        【讨论】:

        • 在 IDEA 用户论坛中留下指向 discussion 的链接。
        【解决方案5】:

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

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

        或将Xlint option 更改为warning(或ignore)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-08-12
          • 2021-11-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-11
          • 2015-03-30
          相关资源
          最近更新 更多