Search code examples
antjavac

Ignore Varargs Warnings In Javac


I want to escalate the missing serialversionUID warning to an error and fail my build when it occurs in javac.

I have added the following to my ant task:

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

However, the build also fails with varargs warnings:

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

I tried changing the javac task to

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

However, it made no difference. How do I make the compiler ignore these warnings and only fail on the serialversionUID?

I am using Ant 1.9.4 and tried with Javac 1.6u37, 1.7u79 and 1.8u92

Example class:

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

Solution

  • I know the question is about javac, but let me still mention that ecj can be configured to meet your requirement: simply say -err:serial on the command line.

    With that option this source file

    public class Serial implements java.io.Serializable {}
    

    will trigger this compiler output

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

    Other warnings are not affected by that option. In particular, you could complete suppress the varargs warning by adding -warn:-varargsCast. This isn't necessary because a warning will never let your build fail. But if you really don't want to see this even as a warning, the full command line would look like this:

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

    See the JDT FAQ for using ecj in automated builds, incl. ant.