-
Bug
-
Resolution: Fixed
-
Major
-
Windows 7 x64 with Java SE 8u20, CentOS 6.5 with Java SE 7u55
I created the jenkins project with ant build for java sources.
Install Warnings plugin, and add post-build action scan for compiler warnings.
To select parser for ant java, but there are no parser in the parser drop down list.
(screen capture attached.)
There are two javac parser, "Java Compiler(Eclipse)" and "Java Compiler(javac)".
I selected the later one, then no warning is reported in the ant build.
The console output sample is as follows:
[javac] Compiling 2 source files to C:\Users\momo\.jenkins\jobs\GoodMorningMrJenkins\workspace\app\Java8Lambdas\Album\build\classes
[javac] C:\Users\momo\.jenkins\jobs\GoodMorningMrJenkins\workspace\app\Java8Lambdas\Album\src\music\album\Artist.java:65: warning: [deprecation] getDate() in Date has been deprecated
[javac] int d = new Date().getDate();
[javac] ^
[javac] C:\Users\momo\.jenkins\jobs\GoodMorningMrJenkins\workspace\app\Java8Lambdas\Album\src\music\album\Artist.java:67: warning: [unchecked] unchecked call to add(E) as a member of the raw type List
[javac] list.add("Warning?");
[javac] ^
[javac] where E is a type-variable:
[javac] E extends Object declared in interface List
[javac] 2 warnings
Java Compiler(javac) parser cannot capture these warnings.
I found a AntJavaParser.java source file in Warnings plugin source files.
https://github.com/jenkinsci/warnings-plugin/blob/master/src/main/java/hudson/plugins/warnings/parser/AntJavacParser.java
This file seemed to define a proper regular expression for ant javac output.
It should be in parser seletion list like a "Java Compiler(Ant)".
For case 3, I have set some encodings at project "Configure" > "Post-build Actions" > "Scan for compiler warnings" > "Advanced" > "Default Encoding".
encodings tried are as follows:
Results are same, 0 warnings.
note) "windows-31j" and "MS932" are same. IANA registration name is "Windows-31J".
Expected to succeed in my environment(Windows OS, platform encoding Windows-31J):
note)blank is explained to mean platform default encoding.
I tried to run jenkins with debugger attachable command-line option, then attached NetBeans debugger to the jenkins and analyzed the situation.
> java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8086,suspend=n -jar jenkins-1.579.war
In this point, argument "line" is invalid in any encoding like this.
"\ufffd\ufffd\ufffd[\ufffdU\ufffd[anonymous\ufffd\ufffd\ufffd\ufffd\ufffds"
Non ascii character is misconverted.
So, I looked for where reading console output and what encoding specified, from
stack trace from AntJavacParser.isLineInteresting.
The place is at ParserRegistory.createReader
protected Reader createReader(final InputStream inputStream)
{ return new InputStreamReader(new BOMInputStream(inputStream), defaultCharset); }The specified encoding is a instance field "defaultCharset".
This field is set in constructor.
public ParserRegistry(final List<? extends AbstractWarningsParser> parsers, final String defaultEncoding,
final String includePattern, final String excludePattern) {
defaultCharset = EncodingValidator.defaultCharset(defaultEncoding);
This ParserRegistry constructor is called from WarningsPublisher.parseConsoleLog method.
Collection<FileAnnotation> warnings = new ParserRegistry(
ParserRegistry.getParsers(parserName),
CONSOLE_LOG_ENCODING, getIncludePattern(), getExcludePattern()).parse(build.getLogFile());
Above code, encoding is specified by WarningsPublisher class final field CONSOLE_LOG_ENCODING.
private static final String CONSOLE_LOG_ENCODING = "UTF-8";
This looks like causing miss detections on non UTF-8 encoding platform.
Possible fix is
Collection<FileAnnotation> warnings = new ParserRegistry(
ParserRegistry.getParsers(parserName),
getDefaultEncoding(), getIncludePattern(),
getExcludePattern()).parse(build.getLogFile());
I changed the 2nd argument from CONSOLE_LOG_ENCODING to getDefaultEncoding().
Then the default encoding specified in configuration is applied, and
warnings can detected on Windows OS windows-31j(MS932) encoding.