5

Ich möchte meine Maven Build fehlschlagen lassen, wenn ich vergesse, serialVersionUIDs in einer Serializable Klasse zu deklarieren. Mit javac, das ist einfach:Wie übergebe ich mehrere Befehlszeilenargumente von javac, von denen einige einen Doppelpunkt enthalten, ohne Maven Release-Plugin zu brechen?

$ javac -Xlint:serial -Werror Source.java 

Direkt dass Maven Übersetzung nicht funktioniert:

 <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> 

Die compilerArgument zitiert wird, so javac erhält nur ein Argument, mit -Xlint:serial -Werror, statt -Xlint:serial und -Werror als separate Argumente. So lesen Sie die Dokumentation, und finden 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> 

Das sieht seltsam - der Doppelpunkt macht serial Element im Xlint Namespace, der nicht überall erklärt wird - aber es funktioniert ... bis Sie ein tun wollen Mitteilung:

$ 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.

Anscheinend behandelt der reguläre POM-Reader XML-Namespaces anders als der vom Release-Plugin verwendete.

So wie gehe ich javac mehrere Befehlszeilenschalter, wenn einige dieser Schalter Zeichen enthalten, die für Normal XML-Elemente nicht gültig sind, ohne die Freigabe-Plugin zu brechen?

Antwort

1

Es scheint, dass während Leerzeichen in compilerArgument maskiert sind, das gleiche gilt nicht für Anführungszeichen. Also, wenn Sie die Räume in der Auseinandersetzung mit Anführungszeichen, erhalten Sie zwei Argumente:

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

Das ruft javac "-Xlint:serial" "-Werror" statt javac "-Xlint:serial -Werror".

Es gibt nichts in den Dokumenten über das, das ich finden kann.

+1

für Maven-Compiler-Plugin nicht funktioniert 2.4 – yegor256

+0

Das ist interessant. Ist es ein Fehler oder eine beabsichtigte Verhaltensänderung? – gustafc

+0

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

1

Ich denke, es ist ein Fehler in Maven-Compiler-Plugin, legte ich ein Problem für Entwickler: MCOMPILER-178

5

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

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

Maven 3.1 oder höher

     <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> 

oder Maven 3.0 oder älter

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

Die CompilerArgs wird nicht verfügbar sein bis Version 3.1 – Tony

+0

a) es kam vor 2 Jahren b) Ich habe eine "oder" -Abschnitt –

0

In Bezug auf Kalpesh Soni's answer:

Hinweis für Maven 3.1 oder später nach dem Beispiel von http://maven.apache.org/plugins/maven-compiler-plugin/examples/pass-compiler-arguments.html:

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

Die oben ist groß, wenn Sie eine zusätzliche param übergeben wollen, die Leerzeichen erfordert. In meinem Fall war es -bootclasspath /path/to/custom/rt.jar. In einem solchen Fall müssen Sie auf jedem Platz diese Zeichenfolge aufgeteilt und jeder Teil als neues <arg /> passieren, um nicht Fatal error compiling: invalid flag: ... So ist die Arbeitsbeispiel zu erhalten ist:

<compilerArgs> 
    <arg>-verbose</arg> 
    <arg>-Xlint:all,-options,-path</arg> 
    <arg>-bootclasspath</arg><arg>/path/to/custom/rt.jar</arg> 
</compilerArgs>