我想将丢失的serialversionUID警告升级为错误,并在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
示例类:
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);
}
}
您的警告似乎与-Xlint:varargs
选项无关
根据javac引用-Xlint
的varargs选项:
警告变量参数(varargs)方法的不安全用法,特别是,那些包含不可验证参数的
文档说下面的代码:
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
warning: [unchecked] Possible heap pollution from parameterized vararg type T
(我。e unchecked代替varargs)
您得到的警告可以由以下代码引起:
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
什么也不做。所以你想要的似乎是不可能的。
我知道这个问题是关于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
请参阅JDT FAQ,了解在自动构建中使用ecj,包括. ant。