3

我试图按照本教程进行操作:

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

但我偶然发现了几个问题:

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

但是在运行时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 的 jars 添加到类路径中:

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%" %*

有什么线索吗?

4

1 回答 1

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

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

于 2013-04-17T13:29:25.670 回答