尝试编译AspectJ教程应用程序时出现问题

时间:2013-04-17 13:24:54

标签: java aspectj

我试图遵循这个教程:

http://andrewclement.blogspot.pt/2009/02/load-time-weaving-basics.html

但我偶然发现了一些问题:

首先,我的系统没有设置javacajc PATH变量,所以我将JDK7的bin/目录添加到PATH变量,以及AspectJ的bin/目录。

但是在运行ajc WhereDoesTheTimeGo.java Simple.java时出现以下错误:

[warning] couldn't find aspectjrt.jar on classpath, checked: C:\Program Files\Ja
va\jre7\lib\resources.jar;C:\Program Files\Java\jre7\lib\rt.jar;C:\Program Files
\Java\jre7\lib\sunrsasign.jar;C:\Program Files\Java\jre7\lib\jsse.jar;C:\Program
 Files\Java\jre7\lib\jce.jar;C:\Program Files\Java\jre7\lib\charsets.jar;C:\Prog
ram Files\Java\jre7\lib\jfr.jar;C:\Program Files\Java\jre7\classes;C:\Program Fi
les\Java\jre7\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jre7\lib\ext\dn
sns.jar;C:\Program Files\Java\jre7\lib\ext\jaccess.jar;C:\Program Files\Java\jre
7\lib\ext\localedata.jar;C:\Program Files\Java\jre7\lib\ext\sunec.jar;C:\Program
 Files\Java\jre7\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jre7\lib\ext\
sunmscapi.jar;C:\Program Files\Java\jre7\lib\ext\zipfs.jar;C:\Program Files\Java
\jre7\lib\tools.jar

[error] classpath error: unable to find org.aspectj.lang.JoinPoint (check that a
spectjrt.jar is in your classpath)

所以我手动将引用的文件添加到类路径中:

ajc -cp ajc -cp C:\aspectj1.7\lib\aspectjrt.jar Simple.java WhereDoesTheTimeGo.java

然后执行显然没问题,同时创建了两个.class文件。 但是......:

ajtests>java Simple
Exception in thread "main" java.lang.NoClassDefFoundError: org/aspectj/lang/Sign
ature
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
        at java.lang.Class.getMethod0(Unknown Source)
        at java.lang.Class.getMethod(Unknown Source)
        at sun.launcher.LauncherHelper.getMainMethod(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Caused by: java.lang.ClassNotFoundException: org.aspectj.lang.Signature
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 6 more

所以我再次将AspectJ的jar添加到类路径中:

java -cp C:\aspectj1.7\lib\aspectjrt.jar;C:\aspectj1.7\lib\aspectjtools.jar;C:\aspectj1.7\lib\aspectjweaver.jar;C:\aspectj1.7\lib\org.aspectj.matcher.jar Simple

但这只会产生

Error: Could not find or load main class Simple

这里出了什么问题?为什么这给我带来的痛苦比教程让我相信我必须拥有的那么多?

修改

我注意到我只需要写

aj -cp .;;C:\aspectj1.7\lib\aspectjweaver.jar Simple

这将有效。我发现奇怪的是,aspectjweaver.jar脚本似乎已经传递了aj

@echo off
REM This file generated by AspectJ installer
REM Created on Tue Apr 16 19:02:36 BST 2013 by top_secret

if "%JAVA_HOME%" == "" set JAVA_HOME=C:\Program Files\Java\jre7
if "%ASPECTJ_HOME%" == "" set ASPECTJ_HOME=c:\aspectj1.7

if exist "%JAVA_HOME%\bin\java.exe" goto haveJava
if exist "%JAVA_HOME%\bin\java.bat" goto haveJava
if exist "%JAVA_HOME%\bin\java" goto haveJava
echo java does not exist as %JAVA_HOME%\bin\java
echo please fix the JAVA_HOME environment variable
:haveJava
"%JAVA_HOME%\bin\java" -classpath "%ASPECTJ_HOME%\lib\aspectjweaver.jar" "-Djava.system.class.loader=org.aspectj.weaver.loadtime.WeavingURLClassLoader" "-Daj.class.path=%ASPECTPATH%;%CLASSPATH%" "-Daj.aspect.path=%ASPECTPATH%" %*

有任何线索吗?

1 个答案:

答案 0 :(得分:5)

请尝试使用java命令:

java -cp .;C:\aspectj1.7\lib\aspectjrt.jar;C:\aspectj1.7\lib\aspectjtools.jar;C:\aspectj1.7\lib\aspectjweaver.jar;C:\aspectj1.7\lib\org.aspectj.matcher.jar Simple

您需要在类路径中包含当前目录(编译源文件的位置)。