【问题标题】:AspectJ (annotations) compile-time weave with Ant and NetBeans使用 Ant 和 NetBeans 进行 AspectJ(注释)编译时编织
【发布时间】:2011-07-13 11:52:21
【问题描述】:

我想在 NetBeans 中将编译时 AspectJ 与 Ant 结合使用。我想在 Google App Engine 上运行它,但目前它不是必需的。 AspectJ 是基于注释的。
我更喜欢编译时编织(修改,检测?类)。我不想使用自定义类加载器。如何做到这一点?

我已经拥有的:

我用 NetBeans 尝试了AspectJ Annotation Tutorial。我修改了 build.xml 以处理 aspectj(使用 iajc Ant task),如 here 所述。问题是它需要添加-javaagent:lib/aspectjweaver.jar在 GAE 上是不可能的)。
运行我的构建会生成以下输出:

info compiling C:\NetBeansProjects\TryAspectJ\src\net\andrewewhite\examples\HelloWorld.java
weaveinfo Join point 'method-call(void java.io.PrintStream.println(java.lang.String))' in Type 'net.andrewewhite.examples.HelloWorld' (HelloWorld.java:9) advised by before advice from 'net.andrewewhite.aspects.BasicAspect' (BasicAspect.class:17(from BasicAspect.java))
weaveinfo Join point 'method-call(void java.io.PrintStream.println(java.lang.String))' in Type 'net.andrewewhite.examples.HelloWorld' (HelloWorld.java:9) advised by after advice from 'net.andrewewhite.aspects.BasicAspect' (BasicAspect.class:23(from BasicAspect.java))
info woven class net.andrewewhite.examples.HelloWorld (from C:\NetBeansProjects\TryAspectJ\src\net\andrewewhite\examples\HelloWorld.java)
info Compiler took 2547ms

当我使用-javaagent 参数运行我的项目时,它可以正常工作。 (在 NetBeans 中:单击项目>属性>运行>VM 选项:-javaagent:./dist/lib/aspectjweaver.jar)。来自tutorial的代码输出:

run:
About to make call to print Hello World
Hello World!
Just made call to print Hello World
BUILD SUCCESSFUL (total time: 0 seconds)

没有代理(清除 VM 选项)代码就像没有 AspectJ 一样运行:

run:
Hello World!
BUILD SUCCESSFUL (total time: 0 seconds)

来源:

\TryAspectJ\src\META-INF\aop.xml

<?xml version="1.0" encoding="UTF-8"?>
<aspectj>
    <aspects>
        <aspect name="net.andrewewhite.aspects.BasicAspect" />
    </aspects>
</aspectj>

\TryAspectJ\src\net\andrewewhite\aspects\BasicAspect.java

package net.andrewewhite.aspects;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class BasicAspect {

    @Before("   call(void java.io.PrintStream.println(java.lang.String)) " +
            "&& !within(net.andrewewhite.aspects..*)")
    public void beforePrintlnCall() {
        System.out.println("About to make call to print Hello World");
    }

    @After("    call(void java.io.PrintStream.println(java.lang.String)) " +
           "&&  !within(net.andrewewhite.aspects..*)")
    public void afterPrintlnCall() {
        System.out.println("Just made call to print Hello World");
    }
}

\TryAspectJ\src\net\andrewewhite\examples\HelloWorld.java

package net.andrewewhite.examples;

public class HelloWorld {
    public static void main(String[] argv) {
        System.out.println("Hello World!"); 
    }   
}

\TryAspectJ\build.xml

<?xml version="1.0" encoding="UTF-8"?>
<project name="TryAspectJ" default="default" basedir=".">
    <description>Builds, tests, and runs the project TryAspectJ.</description>
    <import file="nbproject/build-impl.xml"/>        
<taskdef classpath="lib/aspectj/aspectjtools.jar" resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties"/>         

    <target name="aspectj">
        <echo level="info">--- aspectj (start) ---</echo>
        <iajc destDir="${build.classes.dir}" source="1.6" target="1.6" showweaveinfo="true" verbose="true" >
            <inpath>
                <pathelement location="lib/aspectj/aspectjrt.jar"/>
                <pathelement location="${build.classes.dir}" /> 
            </inpath>
            <sourceroots>
                <pathelement location="${src.dir}"/>
            </sourceroots>
            <classpath>
                <pathelement location="${javac.classpath}"/>
                <pathelement location="${j2ee.platform.classpath}"/>
            </classpath>
        </iajc> 
         <echo level="info">--- aspectj finished ---</echo>
    </target>

<target name="-post-compile" depends="aspectj"></target>
</project>

我必须添加或更改什么?

【问题讨论】:

    标签: java google-app-engine netbeans ant aspectj


    【解决方案1】:

    找到解决方案。 这是正确的 build.xml 片段:

    <taskdef classpath="lib/aspectjtools.jar" resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties"/>
    <target name="aspectj">
        <echo level="info">--- aspectj (start) ---</echo>
        <!-- begin fix classpath for this bug https://issues.apache.org/bugzilla/show_bug.cgi?id=40291 -->
        <condition property="targetos" value="windows" else="unix">
            <os family="windows"/>
        </condition>
        <!-- converting classpath -->
        <pathconvert targetos="${targetos}" property="javac.convertedClasspath" >
            <path path="${javac.classpath}" />                   
        </pathconvert>
        <!-- end fix classpath -->
        <iajc source="1.6" target="1.6" showweaveinfo="true" verbose="true" destdir="${build.classes.dir}"  >
            <inpath>
                <pathelement location="${build.classes.dir}"/>    
            </inpath>
            <classpath>
                <pathelement location="${javac.convertedClasspath}" />
            </classpath>
        </iajc>
        <echo level="info">--- aspectj (finished) ---</echo>
    </target>
    <target name="-post-compile" depends="aspectj"></target>
    

    呼叫java -classpath ./lib/aspectjrt.jar -jar TryAspectJ.jar 工作正常。奇怪的是,从 NetBeans(右键单击项目-> 运行)的结果就好像没有 AspectJ。我认为 NetBeans 从build/classes dir 运行项目而不是 jar。但这不是问题。

    【讨论】:

      【解决方案2】:

      您需要添加一个方面路径元素作为 iajc 元素的子元素。

      <aspectpath>
          <pathelement location="..." />
      </aspectpath>
      

      aop.xml 文件仅对 AspectJ 加载时编织是必需的。

      【讨论】:

      • 感谢您的回复。我添加了 。当从 调用时,我收到“警告构建配置错误:跳过丢失、空或损坏的方面路径条目:C:\NetBeansProjects\TryAspectJ\dist\TryAspectJ 。罐”。当从 调用时,警告消失了,但结果与没有 时的结果相同。这是详细的编译日志:zacheusz.eu/java/various/aspectj02.log
      猜你喜欢
      • 2012-11-21
      • 1970-01-01
      • 2013-03-18
      • 2018-04-27
      • 2011-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多