2016-07-04 171 views
0

我想將缺少的serialversionUID警告升級爲錯誤,並在我的構建發生在javac中時失敗。忽略Javac中的可變參數警告

我加入以下到我的Ant任務:

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

然而,構建也沒有可變參數警告:

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 

我試圖改變javac任務至

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

但是,它沒有區別。我如何讓編譯器忽略這些警告,並且只在serialversionUID上失敗?

我使用Ant 1.9.4和用javac 1.6u37,1.7u79嘗試和1.8u92

Example類:

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

回答

1

我知道的問題是關於javac,但讓我仍然提到ecj可以配置爲滿足您的要求:在命令行上簡單地說-err:serial

與該選項這個源文件

public class Serial implements java.io.Serializable {} 

將觸發該編譯器輸出

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

其他警告不會受該選項。特別是,您可以通過添加-warn:-varargsCast來完成抑制可變參數警告。這不是必須的,因爲警告永遠不會讓你的構建失敗。但是,如果你真的不希望看到這甚至是一個警告,完整的命令行應該是這樣的:

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

用於自動使用ECJ生成,含見JDT FAQ。螞蟻。

+0

這並不能解決問題。它還輸出「方法foo(Object ...)的最後一個參數的Type String []與vararg參數類型不完全匹配。Cast to Object []確認非可變參數調用,或者傳遞類型的單個參數可變參數調用的對象。「 – opticyclic

+0

@opticyclic重點在於,通過'ecj',您可以獨立地將不同的診斷信息微調爲警告或錯誤。您顯示的診斷默認分類爲警告。我會更新我的答案,以涵蓋如何完全禁止該警告。 –

+0

你說得對。由於我在同一班上有兩個例子,所以我輸出結果令人困惑。 – opticyclic

2

看來你有警告不相關的-Xlint:varargs選項

根據javac reference-Xlint的可變參數選項:

發出警告的可變參數不安全用法(可變參數)的方法,特別是那些包含非reifiable參數

文檔說以下代碼:

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

應該產生警告:

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

實際的警告,我得到(使用j個AVAC 1.8.0_65)是:

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

(即選中,而不是可變參數

你得到了警告,可以通過代碼引起這樣的:

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

該警告消失只使用-Xlint:none選項,但-Xlint:serial什麼都不做。所以看起來你想要的是不可能的。