AspectJ: How to weave an aspect library into a Java project

前端 未结 1 901
执念已碎
执念已碎 2021-01-04 23:44

I build small library (Java and Maven) - using AspectJ. Library must be independent. Library deliver Aspects and Annotations. Function of library is - \"call advice when exe

1条回答
  •  慢半拍i
    慢半拍i (楼主)
    2021-01-05 00:37

    According to the AspectJ Maven documentation, chapter "using aspect libraries", you need to

    • add the aspect library as a regular ,
    • also add the same dependency (without because it is already assigned in step 1) in the plugin section as an .

    Here is a concrete example:

    Aspect library POM, marker annotation and sample aspect:

    
        4.0.0
    
        de.scrum-master.stackoverflow
        aspectj-lib
        0.0.1-SNAPSHOT
    
        AspectJ Library
    
        
            UTF-8
            1.8
            1.8.7
        
    
        
            
                
                    
                        org.apache.maven.plugins
                        maven-compiler-plugin
                        3.3
                        
                            ${java.source-target.version}
                            ${java.source-target.version}
                            
                            false
                        
                    
                    
                        org.codehaus.mojo
                        aspectj-maven-plugin
                        1.7
                        
                            
                            ${java.source-target.version}
                            ${java.source-target.version}
                            ignore
                            ${java.source-target.version}
                            ${project.build.sourceEncoding}
                            
                            
                        
                        
                            
                                
                                process-sources
                                
                                    compile
                                    test-compile
                                
                            
                        
                        
                            
                                org.aspectj
                                aspectjtools
                                ${aspectj.version}
                            
                        
                    
                
            
            
                
                    org.codehaus.mojo
                    aspectj-maven-plugin
                
                
            
        
    
        
            
                
                    org.aspectj
                    aspectjrt
                    ${aspectj.version}
                    runtime
                
            
        
    
        
            
                org.aspectj
                aspectjrt
            
        
    
        
            Scrum-Master.de - Agile Project Management
            http://scrum-master.de
        
    
    
    
    package de.scrum_master.aspect;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface Marker {}
    
    package de.scrum_master.aspect;
    
    public aspect MyAspect {
        before() : execution(* *(..)) && @annotation(Marker) {
            System.out.println(thisJoinPoint);
        }
    }
    

    Now run mvn clean install on the aspect library project so as to install the dependency into your local Maven repo.

    Java application POM and sample application:

    By the way, in the POM I have also added two optional plugins:

    • One-JAR plugin packages your application with all dependencies (e.g. aspect library and AspectJ runtime) into one artifact, here target/java-app-0.0.1-SNAPSHOT.one-jar.jar. You can just run your application via java -jar target/java-app-0.0.1-SNAPSHOT.one-jar.jar.
    • Exec Maven plugin is useful if you easily want to test your application from the command line via mvn clean install exec:java.

    These two are only for convenience, you do not need them if you dislike them.

    
        4.0.0
    
        de.scrum-master.stackoverflow
        java-app
        0.0.1-SNAPSHOT
    
        Java Application
    
        
            UTF-8
            1.8
            1.8.7
            de.scrum_master.app.Application
        
    
        
            
                
                    
                        org.apache.maven.plugins
                        maven-compiler-plugin
                        3.3
                        
                            ${java.source-target.version}
                            ${java.source-target.version}
                            
                            false
                        
                    
                    
                        org.codehaus.mojo
                        aspectj-maven-plugin
                        1.7
                        
                            
                            ${java.source-target.version}
                            ${java.source-target.version}
                            ignore
                            ${java.source-target.version}
                            ${project.build.sourceEncoding}
                            
                            
                            
                                
                                    de.scrum-master.stackoverflow
                                    aspectj-lib
                                
                            
                        
                        
                            
                                
                                process-sources
                                
                                    compile
                                    test-compile
                                
                            
                        
                        
                            
                                org.aspectj
                                aspectjtools
                                ${aspectj.version}
                            
                        
                    
                    
                        org.codehaus.mojo
                        exec-maven-plugin
                        1.4.0
                        
                            ${main-class}
                        
                    
                    
                        org.dstovall
                        onejar-maven-plugin
                        1.4.4
                        
                            
                                
                                    one-jar
                                
                            
                        
                        
                            0.96
                            ${main-class}
                            true
                        
                    
                
            
            
                
                    org.codehaus.mojo
                    aspectj-maven-plugin
                
                
                
                    org.codehaus.mojo
                    exec-maven-plugin
                    
                        ${main-class}
                    
                
                
                    org.dstovall
                    onejar-maven-plugin
                    
                        ${main-class}
                    
                
            
        
    
        
            
                OneJAR googlecode.com
                http://onejar-maven-plugin.googlecode.com/svn/mavenrepo
            
        
    
        
            
                
                    org.aspectj
                    aspectjrt
                    ${aspectj.version}
                    runtime
                
                
                    de.scrum-master.stackoverflow
                    aspectj-lib
                    0.0.1-SNAPSHOT
                
            
        
    
        
            
                org.aspectj
                aspectjrt
            
                
                    de.scrum-master.stackoverflow
                    aspectj-lib
                
        
    
        
            Scrum-Master.de - Agile Project Management
            http://scrum-master.de
        
    
    
    

    This little driver application demonstrates that you can now annotate methods with @Marker, in this case only foo and zot, but not bar:

    package de.scrum_master.app;
    
    import de.scrum_master.aspect.Marker;
    
    public class Application {
        @Marker
        public static void foo() {}
    
        public static void bar() {}
    
        @Marker
        public static void zot() {}
    
        public static void main(String[] args) {
            foo();
            bar();
            zot();
        }
    }
    

    Console log:

    java -jar target/java-app-0.0.1-SNAPSHOT.one-jar.jar
    
    execution(void de.scrum_master.app.Application.foo())
    execution(void de.scrum_master.app.Application.zot())
    

    0 讨论(0)
提交回复
热议问题