我想将丢失的serialversionUID警告升级为错误,并在javac中发生时使构建失败。
我已将以下内容添加到我的ant任务中:
<compilerarg value="-Xlint:serial"/>
<compilerarg value="-Werror"/>
但是,构建也因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
我尝试将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);
}
}
答案 0 :(得分:2)
您的警告似乎与-Xlint:varargs
选项
根据javac reference -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
我得到的实际警告(使用javac 1.8.0_65)是:
warning: [unchecked] Possible heap pollution from parameterized vararg type T
(即未选中而非 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
无效。所以看起来你想要的东西是不可能的。
答案 1 :(得分: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
来完成抑制varargs警告。这不是必需的,因为警告永远不会让您的构建失败。但如果您真的不想将此视为警告,那么完整的命令行将如下所示:
ecj -err:serial -warn:-varargsCast Main.java
有关在自动构建中使用ecj的信息,请参阅JDT FAQ。蚂蚁。