How to resolve module reads package error in java9

The problem is that your module path contains the same package (javax.annotation) in different modules (java.xml.ws.annotation and tomcat.embed.core), which the module system forbids in order to make configurations more reliable. This is called a split package. The module system tells you as much when listing all the modules that read (i.e. “see”) that package twice. So what to do now?

The first order of business would be to check whether both packages contain the same classes. If yes, you’re in luck. Now all you need to do is make sure the module system only sees one of those, for which there are two possibilities:

  • If from one of the modules, you only need the one package and nothing else, take it out of your configuration and use the other one instead. Maybe you can stop explicitly requiring java.xml.ws.annotation?
  • If you put tomcat.embed.core on the classpath, its version of the package will be completely ignored and the entire system, including the code on the class path will only see the package in java.xml.ws.annotation.

If both variants of the package contain types that (a) the other does not contain and (b) your application needs, you’re in a tougher situation. First of all, that raises the suspicion that tomcat.embed.core did something fishy (although I’m not sure about that). The only thing I know could help could be the non-standard javac option --patch-module.

Leave a Comment