java - 将 iajc 与 java 1.8 JDK 一起使用 - 比较器无法解析为类型

标签 java ant aspectj

我所从事的项目的源代码是在 eclipse 中管理的,但我们实际使用和发布的 .class 和 .war 文件是通过 build.xml 文件使用 ant 构建的。该代码在 Spring 环境中运行,并使用 AspectJ 进行一些编译时编织。我们已经使用 AspectJ 1.6 和 Java 1.6 多年了,但我们现在正在尝试转向使用 Java 1.8(我们安装的 jboss 环境一直在使用 Java 1.6,但正在迁移)到 1.8;此外,我们还致力于将我们的应用程序与其他应用程序解耦,以便我们可以在提供 Java 1.8 的 jetty 容器内独立运行),但 AspectJ 和 Java 1.8 的使用之间似乎存在问题。我发现了一些似乎与我们所看到的问题相关的帖子,尽管我没有发现其中任何一个提供了似乎符合我们特定构建情况的简单解决方案(那些确实有潜在解决方案的帖子)始终引用诸如 Maven 之类的东西或我们不使用的其他东西)。

以下是我们尝试使用 Zulu 中的 Open JDK 8(Windows 为 8u31)进行编译时看到的错误输出:

 [iajc] C:\GitRepos\NSE_decouple\client\src\com\hp\nonstop\nse\test\cli\sort\PhysicalTargetListByName.java:5 [error] Comparator cannot be resolved to a type
 [iajc] public class PhysicalTargetListByName implements Comparator<String>
 [iajc]                                                  ^^^^^^^^^
 [iajc] C:\GitRepos\NSE_decouple\client\src\com\hp\nonstop\nse\test\cli\sort\PhysicalTargetListByName.java:5 [error] The type java.util.Comparator cannot be resolved. It is indirectly referenced from required .class files
 [iajc] public class PhysicalTargetListByName implements Comparator<String>

此错误中引用的特定代码(我怀疑其他代码也会失败,但此失败似乎会停止编译)是:

public class PhysicalTargetListByName implements Comparator<String>
{
<code not included; the declaration itself seems to be the failure point>
}

如果问题与使用aspectj1.6有关,我也安装了最新版本的AspectJ,即AspectJ 1.8.5,但这没有什么区别。

在 eclipse 本身内构建一切正常,但在尝试使用 ant 构建时出现错误,JAVA_HOME 设置为“c:\Program Files\Zulu\zulu-8”,IAJC_HOME 设置为“c:\aspectj1.8”在命令行执行“ant build”之前。在 build.xml 文件中,我们在构建目标任务中执行以下步骤来执行 iajc 编译:

 <iajc destdir="${build.dir}" failonerror="true" 
     showWeaveInfo="${showWeaveInfo.isEnabled}" source="1.6" target="1.6"  
     debug="true"  fork="true"  maxmem="256m">
    <src path="${instsrc.dir}" />
    <exclude name="**/junit/*"/>
    <exclude name="**/install/*"/>
    <classpath refid="master-classpath"/>
    <aspectPath refid="aspectPath"/>
 </iajc>

我也尝试过将源和目标设置为“1.8”,但这也没有什么区别。

build.xml 文件还包含:

<path id="aspectPath">
   <pathelement location="${lib.dir}/spring-aspects.jar"/>
</path>

<path id="master-classpath">
    <fileset dir="${lib.dir}">
        <include name="*.jar"/>
    </fileset>
    <fileset dir="${jetty.dir}/lib">
        <include name="servlet-api-3.0.jar"/>
        <include name="jetty-servlet-8.1.16.v20140903.jar"/>
        <include name="jetty-util-8.1.16.v20140903.jar"/>
    </fileset>
    <fileset dir="${jetty.dir}/lib/jsp">
        <include name="javax.servlet.jsp-2.2.0.v201112011158.jar"/>
    </fileset>
    <pathelement location="${clover.jar}"/>
    <pathelement path="${build.dir}"/>
</path>

在一个实验中,我用 任务替换了 任务,而不是允许构建在没有错误的情况下工作(尽管生成的代码不会被编织),所以看起来错误确实与AspectJ 与 java 1.8 的混合(另一个实验表明,使用 Open JDK 7 和 AspectJ 时我们可以构建而不会出现错误)。

并且帮助指出我们可能需要做什么才能让 AspectJ 与 Java 1.8 版本一起工作,我们将不胜感激!

最佳答案

经过一番摸索和一些偶然的机会,我终于设法找到了是什么阻碍了我迄今为止尝试过的修复解决问题。

这归结为我的 %ANT_HOME%\lib 文件夹中存在aspectjtools.jar 的副本。这个 JAR 是很多很多(很多!)年前就放在那里的。它恰好是 JAR 的 AspectJ 1.6 版本,它的存在导致 ant 使用该版本,即使我们的 build.xml 文件在某些​​时候已被修改以指定 AspectJ 的路径,因此 ant lib 下存在 JAR不需要确定要使用的版本(我最近将其更改为指向 AspectJ 1.8,尽管该文件的存在使我对 build.xml 的更改被忽略)。尽管我认为我现在正在使用 AJ 1.8 和 Java 1.8,但事实并非如此,因此旧版 AJ 和 Java 1.8 之间不兼容的所有基本问题仍然存在。

一旦我从 ant lib 文件夹中删除了该 JAR,我的 ant 构建就会按预期工作,没有错误!

因此,修复方法是删除一个不需要的文件,但到目前为止该文件并未引起明显的问题,因为我们之前已经使用 AJ 1.6 多年了。由于杂散文件的存在,更新到新版本并没有真正生效。无文件==> build.xml配置生效==>编译成功!

关于java - 将 iajc 与 java 1.8 JDK 一起使用 - 比较器无法解析为类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28641080/

相关文章:

java - 将图像下载到内部存储并在android中读取

java - JTextArea 中的控制台 out.print

java - android: TCP 连接性能

java - Android,引用其他库

ant 未被识别为内部或外部命令

java - ant - 禁用 Ivy 以在每次运行时获取依赖项

java - 加载时编译时出错

java - Activity 生命周期

java - @target 和 @within 之间的区别(Spring AOP)

Spring - 如何使用 aspectJ 缓存自调用?