using iajc with java 1.8 JDK -- 比较器无法解析为类型

using iajc with java 1.8 JDK -- Comparator cannot be resolved to a type

我从事的项目的源代码是在 eclipse 中管理的,但是我们实际使用和发布的 .class 和 .war 文件是使用 ant 通过 build.xml 构建的文件。该代码在 Spring 环境中工作,并使用 AspectJ 进行一些编译时织入。多年来,我们一直在使用 AspectJ 1.6 和 Java 1.6,但我们现在正在尝试转向使用 Java 1.8(一个 jboss 环境,我们已经一直在使用 Java 1.6 安装,但正在移至 1.8;此外,我们还在努力将我们的应用程序与其他应用程序分离,以便我们可以 运行 在我们提供 Java1.8),但是AspectJ的使用和Java1.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 的路径,因此 JAR 存在于不需要 ant lib 来确定要使用的版本(我最近更改为指向 AspectJ 1.8,尽管文件的存在使我对 build.xml 的更改被忽略)。尽管我认为我现在使用的是 AJ 1.8 和 Java 1.8,但我不是,所以旧 AJ 和 Java 1.8 之间不兼容的所有基本问题仍然存在。

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

所以解决方法是删除一个不需要的文件,但到那时它还没有引起明显的问题,因为我们以前使用 AJ 1.6 很多年了。由于流浪文件的存在,更新到较新版本并没有真正生效。没有文件 ==> build.xml 配置生效 ==> 编译成功!