32
votes

I am unable to import org.w3c.dom.NodeList package to Eclipse. It is showing

The package org.w3c.dom is accessible from more than one module: <unnamed>, java.xml" error message in eclipse.

Please let me know how to fix this ?

Eclipse Version:

Eclipse IDE for Enterprise Java Developers.

Version: 2019-06 (4.12.0)

Build id: 20190614-1200

Java version:

java version "12.0.1" 2019-04-16

Java(TM) SE Runtime Environment (build 12.0.1+12)

Java HotSpot(TM) 64-Bit Server VM (build 12.0.1+12, mixed mode, sharing)

10
That is a limitation of Java 9 and higher: the same package name must not be used in more than one module. Everything on the classpath is considered as contained in the <unnamed> module. Since org.w3c.dom is already used in the system library, your code and all dependencies/JARs must not use this package even without using JPMS (without having a module-info.java file). So, either use Java 8 or get rid of the code/dependency that contains the org.w3c.dom package.howlger
Thank you for the update. I am using java 12 version, so I cannot downgrade version. Please let me know how to create code/dependency that contains the org.w3c.dom package ?poovaraj
Your code and everything on the classpath must not contain the org.w3c.dom package (as it already used in the system library). Maybe a newer version of the JAR containing org.w3c.dom has in newer versions its own name space for packages instead of org.w3c.dom so it can be used in Java 9 and higher.howlger

10 Answers

10
votes

I had a similar issue because of a transitive xml-apis dependency. I resolved it using a Maven exclusion:

<dependency>
    <groupId>org.apache.xmlgraphics</groupId>
    <artifactId>fop</artifactId>
    <version>0.95</version>
    
    <exclusions>
        <exclusion>
            <groupId>xml-apis</groupId>
            <artifactId>xml-apis</artifactId>
        </exclusion>
    </exclusions>
</dependency>

Another dependency that just causes trouble and I don't have a solution other than removing it is this one:

<dependency>
    <groupId>com.oracle.database.xml</groupId>
    <artifactId>xmlparserv2</artifactId>
    <version>${oracle.version}</version>
</dependency>

Use mvn dependency:tree to see who brings in the transitive dependency, and then exclude that from there.

7
votes

Disappointingly I don't see any compiler flags to show what jar the problem is with Even -Xlint:module doesn't seem to show up anything useful and eclipse doesn't shed any light on the issue

Instead to find where org.w3c.dom comes from I've been using this script:

mvn dependency:copy-dependencies -DincludeScope=test -DoutputDirectory=deps
for i in deps/*.jar; do if unzip -l $i| grep -q org.w3c.dom; then echo $i; fi ; done

Strictly you don't have to specify the scope test as that's the default but I've included it as you might want to use compile instead

5
votes

On my side, I've spent a few hours to understand my issue, really closed to this one.
The package org.w3c.dom is accessible from more than one module: <unnamed>, java.xml

I wanted to migrate a project from Java 8 to Java 11. A few library issues. Easy to fix. But on this one,

  • I've tried to create module-info.java → it was worst.
  • Find a issue on my OS (debian 10) → even if Java 11 was default JRE, $JAVA_HOME was not rightly set for maven build. And when I was thinking it was only an Eclipse issue, I finally consider that it was a global compilation problem. To fix this I had to add following line in ~/.mavenrc

    JAVA_HOME=/usr/lib/jvm/default-java

  • Deep analysis on maven dependencies shows me a third-level dependency on xom.jar which trigger the issue. Dependency was linked to Saxon HE library → an upgrade to VERSION 9.9.X has resolved this boring problem.

Hope this will helps other people.

3
votes

In my case, it was caused by combining the usage of:

  • JDK 11
  • dom4j 2.1.3 library

As pointed out by others, the root cause is that dom4j and its dependencies (e.g., pull-parser) use some packages names (javax.xml.parsers, org.w3c.dom) that have been used by the JDK.

I had to remove dom4j to solve the problem. Just use JDK's own XML api.

3
votes

For Java 9 and higher Delete org.w3c.dom jar file from the class path, and you are done. By the way delete module info file too. You don't need to add the external jar file, its already included in the system library of java 9 and higher.

1
votes

Just open the configure build path and verify the modules which are all you have added as part of the project, which contains the class files as *

org.w3c.dom

This error, we usually gets in Java due to same kind of multiple API packages added in one project.

As, am using the same version as you mentioned, am not facing any issues., so just make sure that you don't have any duplicate modules.

1
votes

In my case I was using:
JDK 14 and xmlbeans.jar library.
I just had to remove the xmlbeans.jar library and it surely solved the issue.

0
votes

org.w3c.dom is used in:

<dependency>
    <groupId>org.apache.xmlbeans</groupId>
    <artifactId>xmlbeans</artifactId>
    <version>2.4.0</version>
</dependency>

Check if this is imported transitively via some other dependency. Exclude the same

Add dependency for:

<dependency>
    <groupId>org.apache.xmlbeans</groupId>
    <artifactId>xmlbeans</artifactId>
    <version>2.6.0</version>
</dependency>
0
votes

reference screenshot Nothing worked for me, finally when I changed version to 1.8 it started working after maven build,

  1. Go to project properties from project or press ALT + ENTER
  2. Go to Java compiler window
  3. Changer version to 1.8 ( see attached image for reference )
0
votes

If you are in a simple Java Project, not Maven. Then just remove the dom-jaxb jar from the Libraries.

Steps : Right click on project -> Properties -> Java BuildPath -> Libraries Tab -> select on jars such as dom-2.3.0-jaxb-1.0.6(version might differ) -> Remove.

Now it will build without error.

The error is occurring because "org.w3c.dom.Document" is coming from both the removed "dom-2.3.0-jaxb-1.0.6" jar and from Java's in-built libraries. Removing additional jar will let it come only from Java's in-built libraries.