[ 
https://issues.apache.org/jira/browse/MCOMPILER-485?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17574296#comment-17574296
 ] 

Alexander Kriegisch commented on MCOMPILER-485:
-----------------------------------------------

Just in case other AspectJ users also get weird errors due to this problem: I 
never would have expected this to be an MCOMPILER problem, unaware of the fact 
that the plugin actually creates byte code for package infos using ASM instead 
of relying on Javac or ECJ functionality. I even implemented a woraround in the 
AspectJ compiler for this, because I thought that Javac itself creates bogus 
byte code for this corner case. Only later I noticed that Maven Compiler itself 
was the culprit. See https://github.com/eclipse/org.aspectj/issues/176. This 
was an expensive bug.

Lesson learned(?): I think you should have used Java compiler functionality in 
order to create those files, namely {{-Xpkginfo:always}} on Javac and rely on 
ECJ to create those class files by default anyway. No own implementation, no 
own bug.

> Incorrect internal string format in generated package-info.class files on 
> Windows
> ---------------------------------------------------------------------------------
>
>                 Key: MCOMPILER-485
>                 URL: https://issues.apache.org/jira/browse/MCOMPILER-485
>             Project: Maven Compiler Plugin
>          Issue Type: Bug
>    Affects Versions: 3.10.0
>         Environment: Windows, or any operating system with a file separator 
> character other than a forward slash
>            Reporter: Daniel Widdis
>            Assignee: Olivier Lamy
>            Priority: Major
>             Fix For: 3.10.1
>
>
> In 3.10.0, a new feature to generate package-info classes was added in 
> [[MCOMPILER-205] |https://github.com/apache/maven-compiler-plugin/pull/88]
> Unfortunately, the binary class file is incorrectly generated using Java's 
> file toString() which uses a platform dependent file separator character: on 
> Windows, these Strings contain a backslash.  See [this 
> line|https://github.com/gnodet/maven-compiler-plugin/blob/8521ef8fdd12cc0b85c1ace17114ed3d3ffd0b0c/src/main/java/org/apache/maven/plugin/compiler/AbstractCompilerMojo.java#L1356]
>  which passes the platform-dependent file name (minus the root path and .java 
> extension) to the ClassWriter.
> The Java class file specification (4.2.1) specifies the internal format: "In 
> this internal form, the ASCII periods (.) that normally separate the 
> identifiers which make up the binary name are replaced by ASCII forward 
> slashes (/)."
> This invalid class file format causes problems in downstream plugins, e.g.,
>  * The bnd-maven-plugin fails with an error: Classes found in the wrong 
> directory: 
> \{oshi/jna/platform/unix/package-info.class=oshi\jna\platform\unix\package-info
>  ... (and hundreds more) ... }
>  * The JDK's 
> [classFileParser|https://github.com/openjdk/jdk17/blob/74007890bb9a3fa3a65683a3f480e399f2b1a0b6/src/hotspot/share/classfile/classFileParser.cpp#L5797]
>  will throw java.lang.NoClassDefFoundError: 
> com\puppycrawl\tools\checkstyle\ant\package-info (wrong name: 
> com/puppycrawl/tools/checkstyle/ant/package-info
> Steps to reproduce:
>  # Perform a build on any Windows machine using maven-compiler-plugin 3.10.0
>  # Inspect any of the generated package-info.class files in target/classes 
> using a text editor
> Expected behavior:
> Internal strings representing package names use forward slashes
> Observed behavior:
> Internal strings representing package names use backward slashes
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to