2016-07-04 1 views
0

Je veux escalader l'avertissement serialversionUID manquant à une erreur et échouer ma construction quand elle se produit dans javac.Ignorer les avertissements de Varargs dans Javac

J'ai ajouté ce qui suit à ma tâche de fourmi:

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

Cependant, la génération échoue également avec des avertissements varargs:

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 

J'ai essayé de changer la tâche javac à

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

Cependant, cela n'a fait aucune différence. Comment est-ce que je fais le compilateur ignorer ces avertissements et seulement échouer sur le serialversionUID?

J'utilise Ant 1.9.4 et essayé avec Javac 1.6u37, 1.7u79 et 1.8u92

Exemple Classe:

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); 
    } 
} 

Répondre

1

Je sais que la question porte sur javac, mais permettez-moi de mentionner encore que ecj peut être configuré pour répondre à vos besoins: il suffit de dire -err:serial sur la ligne de commande.

Avec cette option fichier cette source

public class Serial implements java.io.Serializable {} 

déclenchera cette sortie du compilateur

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

D'autres avertissements ne sont pas affectés par cette option. En particulier, vous pouvez compléter supprimer l'avertissement varargs en ajoutant -warn:-varargsCast. Ce n'est pas nécessaire car un avertissement ne laissera jamais votre build échouer. Mais si vous ne voulez vraiment pas voir ce même comme un avertissement, la ligne de commande complète ressemblerait à ceci:

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

Voir la JDT FAQ pour l'utilisation de CJE dans automatisé construit, y compris. fourmi.

+0

Cela ne résout pas le problème. Il sort aussi "Type String [] du dernier argument à la méthode foo (Object ...) ne correspond pas exactement au type de paramètre vararg. Cast to Object [] pour confirmer l'invocation non-varargs, ou passer des arguments individuels de type Objet pour une invocation de varargs. " – opticyclic

+0

@opticyclic Le fait est qu'avec 'ecj' vous pouvez ajuster indépendamment différents diagnostics à l'avertissement ou à l'erreur. Le diagnostic que vous affichez est classé comme un avertissement par défaut. Je vais mettre à jour ma réponse pour couvrir comment supprimer complètement cet avertissement. –

+0

Vous avez raison. J'ai confondu le résultat car j'avais deux exemples dans la même classe. – opticyclic

2

Il semble que l'avertissement vous est pas lié à la -Xlint:varargs option

Selon javac reference l'option varargs pour -Xlint:

met en garde contre les usages dangereux des arguments variables méthodes (varargs), en particulier, ceux qui contiennent des arguments non réifiable

La documentation indique que le code suivant:

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

devrait produire la avertissement:

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

L'avertissement réel que je reçois (en utilisant j avac 1.8.0_65) est:

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

(c.-à-sans contrôle au lieu de varargs)

L'avertissement que vous avez peut être provoqué par le code comme ceci:

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); 
} 

Cet avertissement est parti seulement en utilisant l'option -Xlint:none, mais alors -Xlint:serial ne fait rien. Donc, il semble que ce que vous voulez n'est pas possible.