5

Tôi muốn làm cho xây dựng Maven của tôi không thành công khi tôi quên khai báo serialVersionUID trong lớp Serializable. Với javac, đó là dễ dàng:Làm cách nào để chuyển javac nhiều đối số dòng lệnh, một số trong đó bao gồm dấu hai chấm, mà không phá vỡ plugin phát hành Maven?

$ javac -Xlint:serial -Werror Source.java 

trực tiếp dịch đó để Maven không hoạt động:

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>2.5.1</version> 
      <configuration> 
       <compilerArgument>-Xlint:serial -Werror</compilerArgument> 
      </configuration> 
     </plugin> 

Các compilerArgument được trích dẫn, vì vậy javac chỉ nhận một đối số, chứa -Xlint:serial -Werror, thay vì -Xlint:serial-Werror như các đối số riêng biệt. Vì vậy, bạn đọc các tài liệu, và tìm compilerArguments:

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>2.5.1</version> 
      <configuration> 
       <compilerArguments> 
        <Xlint:serial /> 
        <Werror /> 
       </compilerArguments> 
      </configuration> 
     </plugin> 

này trông lạ - đại tràng làm cho serial yếu tố trong không gian tên Xlint, mà không được khai báo bất cứ nơi nào - nhưng nó hoạt động ... cho đến khi bạn muốn làm một phát hành:

$ mvn release:prepare

org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-release-plugin:2.3.2:prepare (default-cli) on project my-project: Error reading POM: Error on line 58: The prefix "Xlint" for element "Xlint:serial" is not bound.

Rõ ràng, đầu đọc POM thông thường xử lý các không gian tên XML theo một cách khác so với cái được sử dụng bởi plugin phát hành.

Vậy làm cách nào để vượt qua javac nhiều thiết bị chuyển mạch dòng lệnh khi một số thiết bị chuyển mạch có chứa các ký tự không hợp lệ cho các phần tử XML đơn giản mà không phá vỡ plugin phát hành?

Trả lời

1

Dường như trong khi dấu cách được thoát trong compilerArgument, điều này cũng không đúng đối với dấu ngoặc kép. Vì vậy, nếu bạn đặt các không gian trong đối số với dấu ngoặc kép, bạn sẽ có hai đối số:

<compilerArgument>-Xlint:serial" "-Werror</compilerArgument> 

này gọi javac "-Xlint:serial" "-Werror" hơn javac "-Xlint:serial -Werror".

Không có gì trong tài liệu về điều này mà tôi có thể tìm thấy.

+1

không làm việc cho maven-biên dịch-Plugin 2.4 – yegor256

+0

Thật thú vị. Nó là một lỗi hoặc một thay đổi dự định trong hành vi? – gustafc

+0

xem [MCOMPILER-62] (http://jira.codehaus.org/browse/MCOMPILER-62) – yegor256

1

Tôi nghĩ rằng đó là một lỗi trong maven-biên dịch-plugin, tôi gửi một vấn đề để các nhà phát triển: MCOMPILER-178

5

Xem http://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html#compilerArgs

http://maven.apache.org/plugins/maven-compiler-plugin/examples/pass-compiler-arguments.html

Maven 3.1 hay muộn

     <source>1.6</source> 
         <target>1.6</target> 
         <showDeprecation>true</showDeprecation> 
         <showWarnings>true</showWarnings> 
         </processors> 
         <compilerArgs> 
          <arg>-verbose</arg> 
          <arg>-Aeclipselink.persistencexml=src/main/resources/META-INF/persistence.xml</arg> 
         </compilerArgs> 

hoặc Maven 3.0 hoặc cũ hơn

 <compilerArguments> 
     <verbose /> 
     </compilerArguments> 
     <compilerArgument>-Aeclipselink.persistencexml=src/main/resources/META-INF/persistence.xml</compilerArgument> 
+0

Trình biên dịchArgs sẽ không có sẵn cho đến phiên bản 3.1 – Tony

+0

a) nó xuất hiện 2 năm trước b) Tôi có phần "hoặc" –

0

Liên quan đến Kalpesh Soni's answer:

Lưu ý cho Maven 3.1 hay muộn theo ví dụ từ http://maven.apache.org/plugins/maven-compiler-plugin/examples/pass-compiler-arguments.html:

<compilerArgs> 
    <arg>-verbose</arg> 
    <arg>-Xlint:all,-options,-path</arg> 
</compilerArgs> 

Trên đây là rất tốt, trừ khi bạn muốn vượt qua một param bổ sung mà đòi hỏi nhân vật không gian. Trong trường hợp của tôi là -bootclasspath /path/to/custom/rt.jar. Trong trường hợp này bạn phải chia chuỗi này trên mọi không gian và vượt qua tất cả các phần như một mới <arg /> để không để có được Fatal error compiling: invalid flag: ... Vì vậy, ví dụ làm việc là:

<compilerArgs> 
    <arg>-verbose</arg> 
    <arg>-Xlint:all,-options,-path</arg> 
    <arg>-bootclasspath</arg><arg>/path/to/custom/rt.jar</arg> 
</compilerArgs> 
Các vấn đề liên quan