You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@maven.apache.org by "Artem K. (Jira)" <ji...@apache.org> on 2022/11/01 14:07:00 UTC
[jira] [Updated] (MCOMPILER-510) NullPointerException when using --patch-module compiler argument
[ https://issues.apache.org/jira/browse/MCOMPILER-510?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Artem K. updated MCOMPILER-510:
-------------------------------
Description:
h2. Summary
When using {{--patch-module}} compiler argument, there is a {{NullPointerException}} due to field {{pathElements}} not being initialized in {{{}CompilerMojo{}}}.
h2. Description
The method {{preparePaths}} in {{CompilerMojo}} has two code paths:
{code:java}
@Override
protected void preparePaths( Set<File> sourceFiles )
{
boolean hasModuleDescriptor = false;
// ...
if ( hasModuleDescriptor )
{
modulepathElements = new ArrayList<>( compilePath.size() );
classpathElements = new ArrayList<>( compilePath.size() );
pathElements = new LinkedHashMap<>( compilePath.size() );
}
else
{
classpathElements = new ArrayList<>();
modulepathElements = Collections.emptyList();
// ...
}
}{code}
Notice that in the else part, {{pathElements}} is not initialized. This field is used when the compiler arguments contain {{--patch-module}} switch. So whenever the compiler is used with this switch and there is no module descriptor in the project, NPE occurs.
h2. Proof-of-concept
Attached is a simple proof-of-concept to illustrate the issue. The project consists of a single class with raises {{NullPointerException}} using a new constructor {{{}NullPointerException(Throwable){}}}, which does not exist in base JDK.
* When executing {{{}javac{}}}{{{{}} src\main\java\poc\Main.java{}}}, the compilation fails as expected.
* Using a replacement {{NullPointerException}} class in {{java_base.jar}} with the added constructor, the compilation works fine:{{{{}} javac --patch-module java.base=java_base.jar src\main\java\poc\Main.java{}}}.
* Attempting to do the same using Maven compiler plugin results in NullPointerException: {{mvn -X compile}}
h2. Walkaround
I was able to fix the problem by adding the line
{code:java}
pathElements = Collections.emptyMap(); {code}
to the else part of the {{{}CompilerMojo.preparePaths{}}}.
The compilation started working, it does however produce a warning
{noformat}
[WARNING] Can't locate java_base.jar{noformat}
every single time. I did not investigate much the cause of this message.
Also note that while similar, this issues is not the same as MCOMPILER-311.
was:
h2. Summary
When using {{--patch-module}} compiler argument, there is a {{NullPointerException}} due to field {{pathElements}} not being initialized in {{{}CompilerMojo{}}}.
h2. Description
The method {{preparePaths}} in {{CompilerMojo}} has two code paths:
{code:java}
@Override
protected void preparePaths( Set<File> sourceFiles )
{
boolean hasModuleDescriptor = false;
// ...
if ( hasModuleDescriptor )
{
modulepathElements = new ArrayList<>( compilePath.size() );
classpathElements = new ArrayList<>( compilePath.size() );
pathElements = new LinkedHashMap<>( compilePath.size() );
}
else
{
classpathElements = new ArrayList<>();
modulepathElements = Collections.emptyList();
// ...
}
}{code}
Notice that in the else part, {{pathElements}} is not initialized. This field is used when the compiler arguments contain {{--patch-module}} switch. So whenever the compiler is used with this switch and there is no module descriptor in the project, NPE occurs.
h2. Proof-of-concept
Attached is a simple proof-of-concept to illustrate the issue. The project consists of a single class with raises {{NullPointerException}} using a new constructor {{{}NullPointerException(Throwable){}}}, which does not exist in base JDK.
* When executing {{javac}}{{{} src\main\java\poc\Main.java{}}}, the compilation fails as expected.
* Using a replacement {{NullPointerException}} class in {{java_base.jar}} with the added constructor, the compilation works fine:{{{} javac --patch-module java.base=test.jar src\main\java\poc\Main.java{}}}.
* Attempting to do the same using Maven compiler plugin results in NullPointerException: {{mvn -X compile}}
h2. Walkaround
I was able to fix the problem by adding the line
{code:java}
pathElements = Collections.emptyMap(); {code}
to the else part of the {{{}CompilerMojo.preparePaths{}}}.
The compilation started working, it does however produce a warning
{noformat}
[WARNING] Can't locate java_base.jar{noformat}
every single time. I did not investigate much the cause of this message.
Also note that while similar, this issues is not the same as MCOMPILER-311.
> NullPointerException when using --patch-module compiler argument
> ----------------------------------------------------------------
>
> Key: MCOMPILER-510
> URL: https://issues.apache.org/jira/browse/MCOMPILER-510
> Project: Maven Compiler Plugin
> Issue Type: Bug
> Affects Versions: 3.10.1
> Reporter: Artem K.
> Priority: Major
> Attachments: poc.zip
>
>
> h2. Summary
> When using {{--patch-module}} compiler argument, there is a {{NullPointerException}} due to field {{pathElements}} not being initialized in {{{}CompilerMojo{}}}.
> h2. Description
> The method {{preparePaths}} in {{CompilerMojo}} has two code paths:
> {code:java}
> @Override
> protected void preparePaths( Set<File> sourceFiles )
> {
> boolean hasModuleDescriptor = false;
> // ...
> if ( hasModuleDescriptor )
> {
> modulepathElements = new ArrayList<>( compilePath.size() );
> classpathElements = new ArrayList<>( compilePath.size() );
> pathElements = new LinkedHashMap<>( compilePath.size() );
> }
> else
> {
> classpathElements = new ArrayList<>();
> modulepathElements = Collections.emptyList();
> // ...
> }
> }{code}
> Notice that in the else part, {{pathElements}} is not initialized. This field is used when the compiler arguments contain {{--patch-module}} switch. So whenever the compiler is used with this switch and there is no module descriptor in the project, NPE occurs.
> h2. Proof-of-concept
> Attached is a simple proof-of-concept to illustrate the issue. The project consists of a single class with raises {{NullPointerException}} using a new constructor {{{}NullPointerException(Throwable){}}}, which does not exist in base JDK.
> * When executing {{{}javac{}}}{{{{}} src\main\java\poc\Main.java{}}}, the compilation fails as expected.
> * Using a replacement {{NullPointerException}} class in {{java_base.jar}} with the added constructor, the compilation works fine:{{{{}} javac --patch-module java.base=java_base.jar src\main\java\poc\Main.java{}}}.
> * Attempting to do the same using Maven compiler plugin results in NullPointerException: {{mvn -X compile}}
> h2. Walkaround
> I was able to fix the problem by adding the line
> {code:java}
> pathElements = Collections.emptyMap(); {code}
> to the else part of the {{{}CompilerMojo.preparePaths{}}}.
> The compilation started working, it does however produce a warning
> {noformat}
> [WARNING] Can't locate java_base.jar{noformat}
> every single time. I did not investigate much the cause of this message.
> Also note that while similar, this issues is not the same as MCOMPILER-311.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)