忽略Javac中的可变变量警告



我想将丢失的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

我得到的实际警告(使用javac 1.8.0_65)是:

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。

相关内容

  • 没有找到相关文章

最新更新