2016-07-04 27 views
0

Ich möchte die fehlende serialversionUID-Warnung zu einem Fehler eskalieren und mein Build fehlschlagen, wenn es in javac auftritt.Warnungen von Varargs ignorieren In Javac

Ich habe folgendes meine Ant-Task hinzugefügt:

<compilerarg value="-Xlint:serial"/> 
    <compilerarg value="-Werror"/> 

jedoch die Erstellung fehl auch mit varargs Warnungen:

non-varargs call of varargs method with inexact argument type for last parameter; 
cast to java.lang.Object for a varargs call 
cast to java.lang.Object[] for a non-varargs call and to suppress this warning 

Ich habe versucht, die javac Aufgabe

<compilerarg value="-Xlint:-varargs"/> 
    <compilerarg value="-Xlint:serial"/> 
    <compilerarg value="-Werror"/> 
Ändern

Es machte jedoch keinen Unterschied. Wie lasse ich den Compiler diese Warnungen ignorieren und nur auf der serialversionUID fehlschlagen?

I Ant 1.9.4 bin mit und versucht, mit Javac 1.6u37, 1.7u79 und 1.8u92

Beispiel Klasse:

package com.stackoverflow.compiler; 

import java.io.Serializable; 

public class Main implements Serializable { 

    public static void foo(Object... args) { 
     System.out.println("Test foo"); 
    } 

    public static void main(String[] args) { 
     // is args supposed to be an array of objects 
     // or the only element in an array? 
     foo(args); 
    } 
} 

Antwort

1

Ich weiß, die Frage ist über javac, aber lassen Sie mich noch erwähnen, dass ecj kann konfiguriert werden, um Ihre Anforderung zu erfüllen: einfach sagen -err:serial in der Befehlszeile.

Mit dieser Option diese Quelldatei

public class Serial implements java.io.Serializable {} 

wird dieser Compiler Ausgabe

---------- 
1. ERROR in /tmp/Serial.java (at line 1) 
     public class Serial implements java.io.Serializable {} 
        ^^^^^^ 
The serializable class Serial does not declare a static final serialVersionUID field of type long 
---------- 
1 problem (1 error) 

Andere Warnungen von dieser Option betroffen sind nicht auslösen. Insbesondere können Sie die varargs-Warnung unterdrücken, indem Sie -warn:-varargsCast hinzufügen. Dies ist nicht notwendig, da eine Warnung Ihr Build niemals fehlschlagen lässt. Aber wenn Sie wirklich nicht wollen, dies auch als eine Warnung sehen, die volle Befehlszeile würde wie folgt aussehen:

ecj -err:serial -warn:-varargsCast Main.java 

die JDT FAQ Siehe für die Verwendung von ecj in automatisierten Builds, inkl. Ameise.

+0

Dies löst das Problem nicht. Es gibt auch "Type String [] des letzten Arguments der Methode foo (Object ...) aus, stimmt nicht genau mit dem Vararg-Parametertyp überein. Cast to Object [], um den Nicht-Varargs-Aufruf zu bestätigen oder einzelne Argumente vom Typ zu übergeben Objekt für eine Varargs-Invokation. " – opticyclic

+0

@opticyclic Der Punkt ist, dass Sie mit 'ecj' verschiedene Diagnosen unabhängig voneinander auf Warnung oder Fehler einstellen können. Die angezeigte Diagnose wird standardmäßig als Warnung klassifiziert. Ich werde meine Antwort aktualisieren, um zu beschreiben, wie diese Warnung vollständig unterdrückt werden kann. –

+0

Sie haben Recht. Ich habe die Ausgabe verwechselt, da ich zwei Beispiele in derselben Klasse hatte. – opticyclic

2

Es scheint, dass die Warnung Sie haben nicht auf die -Xlint:varargs verwandt Option

nach javac reference die varargs Option für -Xlint:

warnt über unsichere Verwendungen von variablen Argumenten (varargs) -Methoden, insbesondere solche, die nicht-reifiable Argumente enthalten

Die Dokumentation sagt, dass den folgenden Code:

public class ArrayBuilder { 
    public static <T> void addToList (List<T> listArg, T... elements) { 
    for (T x : elements) { 
     listArg.add(x); 
    } 
    } 
} 

sollte die produzieren Warnung:

warning: [varargs] Possible heap pollution from parameterized vararg type T

Die eigentliche Warnung I (mit j erhalten AVAC 1.8.0_65) ist:

warning: [unchecked] Possible heap pollution from parameterized vararg type T

(dh ungeprüft statt varargs)

Die Warnung Sie von Code wie folgt verursacht werden können bekam:

public static void foo(Object... args) {...} 

public static void main(String[] args) { 
    // is args supposed to be an array of objects 
    // or the only element in an array? 
    foo(args); 
} 

Diese Warnung ging nur mit -Xlint:none Option, aber dann -Xlint:serial tut nichts. So scheint es, was du willst, ist nicht möglich.