2014-11-11 20 views
11

Tôi cố gắng sử dụng plugin mj aspectj cho dự án biên dịch với trình biên dịch aspectj và sau đó tôi cố gắng đóng gói các lớp vào tệp "war". Thật không may, nó không hoạt động với cấu hình như sau (pom.xml):AspectJ Maven Plugin không thể biên dịch dự án của tôi

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <version>2.17</version> 
      <configuration> 
       <skipTests>true</skipTests> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>com.liferay.maven.plugins</groupId> 
      <artifactId>liferay-maven-plugin</artifactId> 
      <version>${liferay.maven.plugin.version}</version> 
      <executions> 
       <execution> 
        <phase>generate-sources</phase> 
       </execution> 
      </executions> 
      <configuration> 
       <autoDeployDir>${liferay.auto.deploy.dir}</autoDeployDir> 
       <appServerDeployDir>${liferay.app.server.deploy.dir}</appServerDeployDir> 
       <appServerLibGlobalDir>${liferay.app.server.lib.global.dir}</appServerLibGlobalDir> 
       <appServerPortalDir>${liferay.app.server.portal.dir}</appServerPortalDir> 
       <liferayVersion>${liferay.version}</liferayVersion> 
       <pluginType>portlet</pluginType> 

      </configuration> 
     </plugin> 
     <plugin> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>2.5</version> 
      <configuration> 
       <encoding>UTF-8</encoding> 
       <source>1.7</source> 
       <target>1.7</target> 
       <showWarnings>true</showWarnings> 
       <failOnError>true</failOnError> 
      </configuration> 
     </plugin> 
     <plugin> 
      <artifactId>maven-resources-plugin</artifactId> 
      <version>2.5</version> 
      <configuration> 
       <encoding>UTF-8</encoding> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>aspectj-maven-plugin</artifactId> 
      <version>1.7</version> 
      <configuration> 
       <source>1.7</source> 
       <target>1.7</target> 
       <compilationLevel>1.7</compilationLevel> 
       <encoding>UTF-8</encoding> 
      </configuration> 
      <executions> 
       <execution> 
        <phase>process-sources</phase> 
        <goals> 
         <goal>compile</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

<dependency> 
    <groupId>org.aspectj</groupId> 
    <artifactId>aspectjrt</artifactId> 
    <version>1.7.4</version> 
    <type>jar</type> 
</dependency> 

Sau mvn clean install tôi thấy ngoại lệ sau:

[INFO] --- aspectj-maven-plugin:1.7:compile (default) @ tvbs-portlet --- 
[INFO] Showing AJC message detail for messages of types: [error, warning, fail] 
[ERROR] Missing message: configure.incompatibleComplianceForSource in: org.aspectj.ajdt.ajc.messages 
    <unknown source file>:<no line information> 

[ERROR] no sources specified 
    <unknown source file>:<no line information> 

[ERROR] AspectJ Compiler 1.8.2 

    Usage: <options> <source file | @argfile>.. 

AspectJ-specific options: 
    -inpath <list>  use classes in dirs and jars/zips in <list> as source 

Ai có thể gợi ý cho tôi một số giải pháp?

+0

Bạn có muốn chấp nhận + upvoting câu trả lời của tôi (câu trả lời có ảnh chụp màn hình) không? Tôi vẫn nghĩ rằng nó là chính xác và chỉ stumpled trên nó một lần nữa. – kriegaex

Trả lời

5

Cập nhật: Trong khi những điều tôi nói về cấu hình AspectJ Maven trong câu trả lời này là chính xác, nguyên nhân gốc rễ của vấn đề cụ thể trong quản lý phụ thuộc Maven xấu - được mô tả trong other answer. Sẽ tốt hơn nếu đó là câu trả lời được chấp nhận và không phải câu trả lời này.


  • tài gợi ý codelion của ý nghĩa, hãy thay đổi <compilationLevel> thẻ của bạn (typo?) - để <complianceLevel>.
  • Không cần hạ cấp xuống phiên bản plugin 1.6, bạn có thể giữ 1.7.
  • Cũng không cần chỉ định lại cấu hình trong phần <execution>, ở cấp plugin là đủ. Vui lòng lưu ý rằng phiên bản AspectJ mặc định trong plugin 1.7 là 1.8.2, vì vậy có lẽ phụ thuộc thời gian chạy của bạn trên 1.7.4 hoạt động, nhưng nếu tôi là bạn, tôi sẽ nâng cấp phiên bản đó, tối ưu đồng bộ hóa với phiên bản plugin. Đó không phải là yêu cầu khó, nhưng tôi nghĩ nó có ý nghĩa.
  • Có thể bạn thậm chí muốn nâng cấp lên phiên bản hiện tại AspectJ 1.8.4, trong plugin cũng như thời gian chạy. Điều này cũng có thể đạt được bằng cách thêm một sự phụ thuộc vào aspectjtools mong muốn phiên bản để cấu hình plugin:
<properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <java.source-target.version>1.8</java.source-target.version> 
     <aspectj.version>1.8.4</aspectj.version> 
    </properties> 

    <build> 
     <pluginManagement> 
       <plugin> 
        <groupId>org.codehaus.mojo</groupId> 
        <artifactId>aspectj-maven-plugin</artifactId> 
        <version>1.7</version> 
        <configuration> 
         <showWeaveInfo>true</showWeaveInfo> 
         <source>${java.source-target.version}</source> 
         <target>${java.source-target.version}</target> 
         <Xlint>ignore</Xlint> 
         <complianceLevel>${java.source-target.version}</complianceLevel> 
         <encoding>UTF-8</encoding> 
         <verbose>true</verbose> 
        </configuration> 
        <executions> 
         <execution> 
          <!-- IMPORTANT --> 
          <phase>process-sources</phase> 
          <goals> 
           <goal>compile</goal> 
           <goal>test-compile</goal> 
          </goals> 
         </execution> 
        </executions> 
        <dependencies> 
         <dependency> 
          <groupId>org.aspectj</groupId> 
          <artifactId>aspectjtools</artifactId> 
          <version>${aspectj.version}</version> 
         </dependency> 
        </dependencies> 
       </plugin> 
      </plugins> 
     </pluginManagement> 

     <plugins> 
      <plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>aspectj-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 

    <dependencyManagement> 
     <dependencies> 
      <dependency> 
       <groupId>org.aspectj</groupId> 
       <artifactId>aspectjrt</artifactId> 
       <version>${aspectj.version}</version> 
       <scope>runtime</scope> 
      </dependency> 
     </dependencies> 
    </dependencyManagement> 

    <dependencies> 
     <dependency> 
      <groupId>org.aspectj</groupId> 
      <artifactId>aspectjrt</artifactId> 
     </dependency> 
    </dependencies> 
+0

Cảm ơn bạn đã trả lời. Tôi đã cố gắng sử dụng cấu hình của bạn, nhưng vẫn nhận được kết quả trước đó ("[ERROR] PESSIMISTIC_WRITE không thể được giải quyết hoặc không phải là trường", "[ERROR] Phương thức createQuery (String) trong loại EntityManager không áp dụng cho các đối số (Chuỗi , Class ) "và các lỗi khác như thế này). Có lẽ trình biên dịch aspectj khác với javac và có một số vấn đề với enums và vv? – dmitrievanthony

+0

Bạn có thể cho tôi quyền truy cập vào dự án của bạn qua GitHub hoặc tương tự không? Tôi đã làm khá nhiều điều với AJMaven plugin AJ ans, vì vậy có lẽ tôi có thể giúp bạn tốt hơn khi tôi nhìn thấy mã thực tế. Chúng tôi cũng có thể sắp xếp riêng tư nếu không thể thực hiện repo công khai. – kriegaex

+0

Tôi chia đôi repo của bạn tại https://github.com/kriegaex/test-aspectj, nhưng ngay cả sau khi gỡ bỏ POM cha mẹ (mà tôi không có) và tự thiết lập các giá trị giả để tham số liferay, tôi không thể xây dựng vì tôi không có truy cập vào repo Maven của bạn tại maven.elcom.spb.ru, có lẽ vì nó là một repo nội bộ. Bên cạnh đó, bạn đã cam kết thư mục 'Maven' mục tiêu của bạn để Git, mà bạn không nên làm. Tôi đã gỡ bỏ nó trong ngã ba của tôi. Bạn có thể vui lòng cung cấp cho tôi một dự án độc lập tái tạo vấn đề của bạn không? Tôi thậm chí không nhận được như xa như nhìn thấy vấn đề thực sự. – kriegaex

12

Nó có vẻ như một vấn đề được biết http://jira.codehaus.org/browse/MASPECTJ-125

Bạn có thể sửa chữa nó bằng cách thêm dòng sau vào tập tin pom của bạn.

<complianceLevel>1.6</complianceLevel> 
+4

Chỉ cần kiểm tra điều này với mức tuân thủ 1.8 và tôi có thể xác minh rằng nó đã sửa lỗi cho tôi. – Ring

1

Nó sẽ làm việc sau khi cấu hình thay đổi plugin để sau:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>aspectj-maven-plugin</artifactId> 
    <version>1.6</version> 
    <configuration> 
     <complianceLevel>1.7</complianceLevel> 
     <source>1.7</source> 
     <target>1.7</target> 
     <encoding>UTF-8</encoding> 
    </configuration> 
    <executions> 
     <execution> 
      <phase>process-sources</phase> 
      <goals> 
       <goal>compile</goal> 
      </goals> 
      <configuration> 
       <complianceLevel>1.7</complianceLevel> 
       <source>1.7</source> 
       <target>1.7</target> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

Nhưng sau này tôi nhận được rất nhiều lỗi biên dịch khác nhau:

[ERROR] Failed to execute goal org.codehaus.mojo:aspectj-maven-plugin:1.6:compile (default) on project tvbs-portlet: Compiler errors: 
[ERROR] error at Entitle.class, entitleId, LockModeType.PESSIMISTIC_WRITE); 
[ERROR] 
[ERROR] /Users/<...>/ejb/BillingEJB.java:43:0::0 PESSIMISTIC_WRITE cannot be resolved or is not a field 
[ERROR] error at .createQuery("select e from Entitle e " + 
[ERROR] 
[ERROR] /Users/<...>/ejb/EntitleEJB.java:62:0::0 The method createQuery(String) in the type EntityManager is not applicable for the arguments (String, Class<Entitle>) 
[ERROR] error at return entityManager.createQuery(
[ERROR] ^^ 

có thể gây ra là không chính xác Plugin AspectJ thông số?

3

Sau khi xem xét dự án Maven bạn https://github.com/dmitrievanthony/test-aspectj tôi phát hiện ra rằng

  • vấn đề là hoàn toàn không liên quan đến AspectJ Maven Plugin,
  • các lỗi biên dịch tương tự cũng xảy ra trong Trình biên dịch trình biên dịch Maven và
  • rằng nguyên nhân gốc rễ của vấn đề của bạn chỉ đơn giản là quản lý sự phụ thuộc xấu.

Đây là một ảnh chụp màn hình (full kích thước here) từ IDEA của IntelliJ "tìm lớp học": (! Ba)

Class LockModeType is found 3x in the project

Như bạn có thể thấy, lớp LockModeType được tìm thấy trong 3 phụ thuộc, một trong đó có một phiên bản của lớp không chứa các giá trị enum dự kiến. Mã của bạn biên dịch nếu bạn loại bỏ sự phụ thuộc này.

<dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>ejb3-persistence</artifactId> 
     <version>1.0.2.GA</version> 
    </dependency> 

Có thể bạn nên dọn dẹp phụ thuộc của mình. Bạn có thể sử dụng Maven Dependency Plugin với các mục tiêu như dependency:analyzedependency:tree cho mục đích đó.

+0

Tại sao bạn không chấp nhận câu trả lời đúng của tôi?!? – kriegaex

0

đảm bảo các mô-đun có mã nguồn, như * .java, v.v. khi tôi biên dịch CAS trên phiên bản 4.0.6 xảy ra lỗi này, tôi thấy cas-server-uber-webapp không có bất kỳ mã nguồn nào trong thư mục src. chỉ cần loại bỏ các mô-đun từ pom.xml mẹ.

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