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

时间:2015-02-21 01:42:40

标签: java ant aspectj

我工作的项目的源代码是在eclipse中管理的,但我们实际使用和发布的.class和.war文件是使用ant通过build.xml文件构建的。该代码在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>

我替换&lt; iajc&gt;的实验。任务与&lt; javac&gt;任务允许构建在没有错误的情况下工作(尽管生成的代码不会被编织)所以看起来错误与AspectJ与java 1.8的混合有关(另一个实验表明我们可以在没有错误的情况下构建使用Open JDK 7和AspectJ)。

有助于指出我们可能需要做些什么才能让AspectJ与Java 1.8版本一起使用,我们将非常感谢!

1 个答案:

答案 0 :(得分:2)

经过一番探索,以及一点点意外之后,我终于成功地找到了解决问题的方法,我已经尝试了解决问题。

归结为我%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。由于存在杂散文件,对较新版本的更新并未真正生效。没有文件==&gt; build.xml配置生效==&gt;编译工作!