2010-09-06 25 views
19

Tôi đang cố gắng thêm aspectj vào dự án maven bằng cách sử dụng java 6.0. Duyệt quanh tôi tìm thấy 2 maven plugins, không cái nào hoạt động theo cách tôi mong đợi.Tôi sử dụng plugin maven nào cho AspectJ?

Lần đầu tiên http://mojo.codehaus.org/aspectj-maven-plugin không hoạt động lúc đầu thông qua netbeans vì tôi không thể lấy mã để biên dịch mã nguồn 5.0 trở lên (nó đã phàn nàn về chú thích v.v.) Sau khi thử từ dòng lệnh đã làm việc và so sánh các lệnh được thực thi, có vẻ như rằng mavens của nó cài đặt mục tiêu không tương thích với plugin và mã java 5+ trong khi mục tiêu biên dịch hoạt động tốt. Mặc dù nó có thể có thể làm việc xung quanh điều này nó là gây phiền nhiễu và mang lại cho tôi câu hỏi: là plugin aspectj-maven vẫn đang được phát triển? Tôi vẫn nên sử dụng nó?

Chế độ thứ hai là của riêng người Apache có vẻ hoạt động hơn và có nhiều khả năng hoạt động hơn. Tuy nhiên tôi không thể tìm thấy bất kỳ ví dụ hoàn chỉnh nào và tôi không thể chạy nó. Tôi tiếp tục nhận được ngoại lệ từ maven:

java.lang.IllegalStateException: The plugin descriptor for the plugin Plugin [maven:maven-aspectj-plugin] was not found. Please verify that the plugin JAR /home/kristofer/.m2/repository/maven/maven-aspectj-plugin/4.0/maven-aspectj-plugin-4.0.jar is intact. 

Tệp jar ở đó, nguyên vẹn và cũng không quan trọng phiên bản của plugin tôi sử dụng, nó luôn ném cùng một ngoại lệ. Bất kỳ ý tưởng nào về vấn đề có thể là gì?

Tóm lại, tôi nên sử dụng plugin nào và plugin nào?

Cảm ơn

Trả lời

17

Dưới đây là một thiết lập làm việc cho tôi (sử dụng dưới ghi aspectj-maven-plugin).

Cấu trúc dự án là như sau:

 
$ tree . 
. 
├── pom.xml 
└── src 
    ├── main 
    │   └── java 
    │    └── com 
    │     └── stackoverflow 
    │      └── Q3651690 
    │       ├── App.java 
    │       └── DontWriteToTheConsole.aj 
    └── test 
     └── java 
      └── com 
       └── stackoverflow 
        └── Q3651690 
         └── AppTest.java 

Với khía cạnh bản demo nhỏ sau:

public aspect DontWriteToTheConsole { 

    pointcut sysOutOrErrAccess() : get(* System.out) || get(* System.err); 

    declare error 
     : sysOutOrErrAccess() 
     : "Don't write to the console"; 

} 

Và pom.xml được cấu hình như thế này:

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.stackoverflow.Q3651690</groupId> 
    <artifactId>Q3651690</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <name>Q3651690</name> 
    <properties> 
    <maven.compiler.source>1.6</maven.compiler.source> 
    <maven.compiler.target>1.6</maven.compiler.target> 
    </properties> 
    <dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.aspectj</groupId> 
     <artifactId>aspectjrt</artifactId> 
     <version>1.6.7</version> 
    </dependency> 
    </dependencies> 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>aspectj-maven-plugin</artifactId> 
     <version>1.3</version> 
     <executions> 
      <execution> 
      <goals> 
       <goal>compile</goal><!-- to weave all your main classes --> 
       <goal>test-compile</goal><!-- to weave all your test classes --> 
      </goals> 
      </execution> 
     </executions> 
     <configuration> 
      <source>${maven.compiler.source}</source> 
      <target>${maven.compiler.target}</target> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

Các các bộ phận chính là:

  • để định cấu hình trình biên dịch maven-plugin cho 1.6 cấp nguồn (điều này được thực hiện bằng cách sử dụng properties)
  • để cấu hình AspectJ-maven-plugin cho 1.6 cấp nguồn (và tôi sử dụng lại các properties sử dụng để cấu hình các maven-biên dịch-plugin ở đây)

Các bước thứ hai có vẻ dư thừa, nhưng, đó là cách mọi thứ đang diễn ra.

Bằng cách này, tôi đã có thể dệt mã sử dụng chú thích, vv:

 
$ mvn clean install 
[INFO] Scanning for projects... 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building Q3651690 
[INFO] task-segment: [clean, install] 
[INFO] ------------------------------------------------------------------------ 
[INFO] [clean:clean {execution: default-clean}] 
[INFO] [resources:resources {execution: default-resources}] 
[INFO] Using 'UTF-8' encoding to copy filtered resources. 
[INFO] skip non existing resourceDirectory /home/pascal/Projects/stackoverflow/Q3651690/src/main/resources 
[INFO] [compiler:compile {execution: default-compile}] 
[INFO] Compiling 1 source file to /home/pascal/Projects/stackoverflow/Q3651690/target/classes 
[INFO] [aspectj:compile {execution: default}] 
[ERROR] Don't write to the console 
[INFO] ------------------------------------------------------------------------ 
[ERROR] BUILD ERROR 
[INFO] ------------------------------------------------------------------------ 
[INFO] Compiler errors: 
error at System.out.println("Hello World!"); 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
/home/pascal/Projects/stackoverflow/Q3651690/src/main/java/com/stackoverflow/Q3651690/App.java:11:0::0 Don't write to the console 
    see also: /home/pascal/Projects/stackoverflow/Q3651690/src/main/java/com/stackoverflow/Q3651690/DontWriteToTheConsole.aj:8::0 
... 
+1

Chúng tôi cũng đang sử dụng trình cắm thêm aspectj-maven để biên dịch các khía cạnh của chúng tôi với Maven –

+0

Sẽ tốt hơn nếu bạn sử dụng chú thích '@ Aspect' .. – yegor256

+0

@Pascal định cấu hình plugin aspectj-maven cho 1.6 nguồn cũng đã cố định thiết lập của tôi. Cảm ơn :) – stratwine

3

Bạn có thể sử dụng plugin Trình biên dịch Maven và thay đổi trình biên dịch để sử dụng AspectJ.

Cấu hình trông như thế này:

<plugin> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <version>2.3.1</version> 
    <configuration> 
     <compilerId>aspectj</compilerId> 
    </configuration> 
    <dependencies> 
     <dependency> 
      <groupId>org.codehaus.plexus</groupId> 
      <artifactId>plexus-compiler-aspectj</artifactId> 
      <version>1.6</version> 
     </dependency> 
    </dependencies> 
</plugin> 

Resources:

Trên cùng một chủ đề:

+0

Tôi đã thử nhưng các khía cạnh của tôi không được thêm vào các lớp học. Thư mục khía cạnh mặc định là gì? Tôi có thể chỉ định nó không? Tôi hiện đang sử dụng src/main/aspect. Các tệp .aj có được chọn không? – Kristofer

+0

Nếu bạn muốn oget công cụ sao chép vào thư mục gốc nguồn trên bản dựng, hãy đặt trong src/main/resources – bwawok

+0

Vẫn không dệt, tôi đã thử cả src/main/java và src/main/resources – Kristofer

2

chúng tôi đang sử dụng AspectJ-maven-plugin cho việc xây dựng một số hệ thống J2EE sản xuất lớp lớn. Gần đây, sự phát triển trên plugin đó dường như không hoạt động quá mức. Lần truy cập cuối cùng là mùa đông năm ngoái và có một số vấn đề nghiêm trọng với "AspectLib" và "WeaveDependencies", đã được báo cáo nhiều lần (ngay cả với các sửa lỗi kèm theo), mà không có bất kỳ phản hồi nào từ phía trên.

Nhưng dù sao, chức năng cơ bản vẫn hoạt động và plugin này hỗ trợ nhiều cấu hình cần thiết trong các dự án thế giới thực.

Pascal Thivent thể hiện phản hồi (rất tốt) của mình ở trên cách định cấu hình plugin với phần phụ thuộc đặc biệt. Bạn có thể sử dụng thủ thuật này cũng để cấu hình phiên bản AspectJ thực tế sử dụng cho biên soạn, như các phiên bản được sử dụng bởi mặc định bằng plugin này là hơi ngày ....

<project xmlns=.... 

<properties> 
    <aspectjVer>1.6.9</aspectjVer> 
    .... 
    .... 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
</properties> 
.... 

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>aspectj-maven-plugin</artifactId> 
      <version>1.3</version> 
      <dependencies> 
       <dependency> 
        <groupId>org.aspectj</groupId> 
        <artifactId>aspectjrt</artifactId> 
        <version>${aspectjVer}</version> 
       </dependency> 
       <dependency> 
        <groupId>org.aspectj</groupId> 
        <artifactId>aspectjtools</artifactId> 
        <version>${aspectjVer}</version> 
       </dependency> 
      </dependencies> 
      <configuration> 
     .... 
</build> 
<dependencies> 
    <dependency> 
     <groupId>org.aspectj</groupId> 
     <artifactId>aspectjrt</artifactId> 
     <version>${aspectjVer}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.aspectj</groupId> 
     <artifactId>aspectjweaver</artifactId><!-- only needed if you use Spring-AOP --> 
     <version>${aspectjVer}</version> 
    </dependency> 
    .... 
    .... 

Note thực tế rằng các plugin có một môi trường classpath độc lập với classpath của dự án của bạn. Vì vậy, chúng ta phải thêm AspectJ-Runtime một cách rõ ràng vào các phụ thuộc của dự án.

+0

Nó chắc chắn sẽ thú vị với một ví dụ về điều đó! – Kristofer

Các vấn đề liên quan