When referencing simple .jar files, Eclipse shows an error stating:
The package java.awt is accessible from more than one module: <unnamed>, java.desktop
This happens for instance when javax.awt
or javax.swing
is included in the .jar files.
The simplest example would be the following:
package test; import javax.swing.JDialog; public class Test { public static void main(String[] args) { new JDialog(); } }
Adding a .jar file to the classpath with only the folder structure javax/swing
(no files needed) will cause the error to appear. I'm using JDK 10/12 (neither works). Setting the compiler compliance to 1.8
makes the whole thing work again. On another machine with Eclipse 2018-09
this works with compiler compliance set to 10
.
I'm on Eclipse 2019-03
, on a (for testing purposes) freshly installed Eclipse 2018-09
it works fine. Why?
Edit June/2020 (Solution)
As the answers correctly stated, this is a restriction built into Java ages ago and only recently was forced upon us. I came into contact with it while migrating a big project with dozens of dependencies to Maven. There were libraries from around the year 2000! There were 'meta libraries' which consisted of several libraries packaged together. So there was no other way than to identify what was still needed (into the trash with the rest!), update libraries which violate the rules or find replacements for them. This took me many, many hours.
In the end it worked out and we've got a nice Maven project to work with.
Module is a uniquely named reusable group of related packages, as well as resources and a module descriptor (module-info.java) All JDK Modules starts with "jdk. *". All Java SE Specifications Modules starts with "java.
This is caused by
java.awt
that also exists in the system library but theIn the Java Platform Module System (JPMS) it is not allowed to use the same package in more than one module. If the Modulepath and the Classpath is used, everything on the Classpath is handled as the <unnamed>
module (in your case the package java.awt
exists in the system module java.desktop
and also via the JAR on the Classpath in the module <unnamed>
).
Since the JRE System Library cannot be moved from the Modulepath to the Classpath (see this answer by Stephan Herrmann for details), you only have the following options:
java
to java_util
and javax
to javax_util
) and recreate the JAR.class
files you have to decompile the .class
files firstIf you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With