资源目录与Java类同名(无.class后缀)是否合规?为何Eclipse报错?
项目场景说明
我的项目采用如下目录结构:
src/ ├── main │ ├── java │ │ └── com │ │ └── soebes │ │ └── packages │ │ └── f1 │ │ └── First.java │ └── resources │ └── com │ └── soebes │ └── packages │ └── f1 │ └── First │ └── test.txt └── test ├── java │ └── com │ └── soebes │ └── packages │ └── f1 │ └── FirstTest.java └── resources └── com └── soebes └── packages └── f1 └── FirstTest └── test.txt
可以看到,resources目录下存在路径为com/soebes/packages/f1/First的目录,该目录名与src/main/java对应路径下的First.java类同名(仅缺少.java后缀)。整个项目编译无任何问题。
构建产物结构
查看构建生成的target目录,结构显示正常:
target/ ├── classes │ └── com │ └── soebes │ └── packages │ └── f1 │ ├── First │ │ └── test.txt │ └── First.class .... └── test-classes └── com └── soebes └── packages └── f1 ├── FirstTest │ └── test.txt └── FirstTest.class
补充说明:最终生成的JAR包结构也正常,可顺利构建未出现报错:
package (main)$ unzip -t target/packages-examples-1.0-SNAPSHOT.jar Archive: target/packages-examples-1.0-SNAPSHOT.jar testing: META-INF/MANIFEST.MF OK testing: META-INF/ OK testing: com/ OK testing: com/soebes/ OK testing: com/soebes/packages/ OK testing: com/soebes/packages/f1/ OK testing: com/soebes/packages/f1/First/ OK testing: META-INF/maven/ OK testing: META-INF/maven/com.soebes.jvm.packages/ OK testing: META-INF/maven/com.soebes.jvm.packages/packages-examples/ OK testing: com/soebes/packages/f1/First/test.txt OK testing: com/soebes/packages/f1/First.class OK testing: META-INF/maven/com.soebes.jvm.packages/packages-examples/pom.xml OK testing: META-INF/maven/com.soebes.jvm.packages/packages-examples/pom.properties OK testing: META-INF/INDEX.LIST OK No errors detected in compressed data of target/packages-examples-1.0-SNAPSHOT.jar.
核心疑问
- 这种类名与同路径资源目录同名的用法是否符合Java相关规范?
- 直接在命令行使用javac编译可正常运行,在IntelliJ IDEA中使用也完全正常。
- 但Eclipse处理该项目时出现问题,报错信息为
The type FirstTest collides with a package,看起来是Eclipse解析target目录时出现的异常。查阅《Java语言规范(JLS)》未找到与该场景相关的规定,也可能是遗漏了相关内容。 - 从技术逻辑上看,类对应的是
FirstTest.class文件,而类文件与同名目录属于不同的文件系统对象,按理不应产生冲突。因此需要确认:- 如果这种用法合规,那么Eclipse的该报错是否属于产品bug?
- 如果这种用法不合规,是否意味着javac、Maven、IntelliJ IDEA的处理都存在问题?
该示例项目已上传至Github仓库供进一步排查。
运行环境信息
- Apache Maven相关版本信息:
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f) Maven home: /Users/khmarbaise/tools/maven Java version: 11.0.8, vendor: AdoptOpenJDK, runtime: /Users/khmarbaise/.sdkman/candidates/java/11.0.8.hs-adpt Default locale: en_GB, platform encoding: UTF-8 OS name: "mac os x", version: "10.14.6", arch: "x86_64", family: "mac" - Eclipse相关版本信息:
Version: 2020-06 (4.16.0) Build id: 20200615-1200 - IntelliJ IDEA相关版本信息:
IntelliJ IDEA 2020.3.1 (Ultimate Edition) Build #IU-203.6682.168, built on December 29, 2020 Runtime version: 11.0.9.1+11-b1145.63 x86_64 VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o. macOS 10.14.6
2021年2月15日补充:已向Eclipse官方提交对应问题反馈。
内容的提问来源于stack exchange,提问作者khmarbaise
相关产品推荐
相关产品推荐

