Compreender erros com módulos JPMS

Sep 25 2020

Estou tendo dificuldade em decifrar o que esses erros significam, quanto mais começar a resolvê-los. Estou tentando usar módulos da plataforma java (usando jdk 14) com um projeto simples "baseado em gradle, multi-módulo" (tudo funciona perfeitamente bem com jdk 8). O projeto usa spring-boot e spring-data-jdbc. Na verdade, minhas principais dependências são

implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-freemarker'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.projectlombok:lombok'

Enquanto eu adicionava module-info.java a cada raiz de origem do projeto, meu IDE (intellJ) foi muito gentil em me dar dicas de quais módulos exportar / exigir, e tudo parecia bom até eu tentar compilar.

Estou incluindo um link repo git aqui para o projeto que é o tópico desta pergunta - https://github.com/m41na/todo-modules-demo

Se você já se deparou com esses problemas (ou semelhantes), poderia esclarecer como foi possível resolvê-los?

error: the unnamed module reads package org.springframework.data.jdbc.core.convert from both spring.data.jdbc and spring.data.relational
error: module spring.context reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
error: module spring.boot.starter.data.jdbc reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
error: module spring.boot.starter.jdbc reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
error: module spring.data.jdbc reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
error: module spring.boot.starter reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
error: module spring.jdbc reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
error: module spring.tx reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
error: module spring.boot.autoconfigure reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
error: module spring.boot reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
error: module spring.aop reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
error: module spring.expression reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
the unnamed module reads package org.springframework.data.jdbc.core.convert from both spring.data.jdbc and spring.data.relational

error: module spring.core reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
error: module spring.boot.starter.logging reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
error: module logback.classic reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
error: module org.apache.logging.slf4j reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
module spring.context reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc

error: module jul.to.slf4j reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
error: module org.slf4j reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
module spring.boot.starter.data.jdbc reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc

error: module java.annotation reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
module spring.boot.starter.jdbc reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc

error: module org.yaml.snakeyaml reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
error: module spring.jcl reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
module spring.data.jdbc reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc

error: module logback.core reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
error: module spring.beans reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
module spring.boot.starter reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc

error: module spring.data.relational reads package org.springframework.data.jdbc.core.convert from both spring.data.jdbc and spring.data.relational
module spring.jdbc reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc

error: module spring.data.commons reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc
module spring.tx reads package org.springframework.data.jdbc.core.convert from both spring.data.relational and spring.data.jdbc

Respostas

1 deduper Sep 29 2020 at 16:58

TL; DR - Resolvi oserros de divisão de pacotes neste clone do seu projeto usando oplugin mrJar Gradle 1 .


A resposta prolixa

„ … Estou tendo dificuldades para decifrar o que esses erros significam… “

Bem-vindo ao mundo dos pacotes divididos ...

„ … 'Dividir pacotes' é um termo Java antigo em que dois pacotes com o mesmo nome existem em diferentes bibliotecas / aplicativos. Java 9 não permite dividir pacotes em módulos diferentes por causa da configuração confiável… “

Essa citação é deste blog .

„ … Se você se deparou com esses (ou semelhantes) problemas… “

Como várias outras questões do Stack Overflow atestam, pacotes divididos são inevitáveis ​​para qualquer pessoa que esteja estruturando seus projetos como módulos JPMS.

„ … Você poderia, por favor, lançar alguma luz sobre como você foi capaz de resolvê-los?… “

Voltando ao TL; DR , resolvi o problema de divisão de pacotes do seu projeto aplicando o plugin que propus. Baixe e construa a demonstração para examinar os resultados.

Como mencionei na documentação dessa demonstração, o suporte a Java 14 + será adicionado a esse plugin dentro de um ou dois dias. Assim que for, atualizarei a demonstração e editarei esta resposta. Mas achei que, em vez de esperar até lá, você ( e outros lurkers interessados ) poderiam se beneficiar hoje com o suporte ao JDK 13 da versão 0.0.16.

Outra solução que propus recentemente é uma implementação daabordagem„ Bridges to the class path “sugerida por Mark Reinhold. Os números 2 e 3 que mencionei nos comentários adotam essa abordagem. Mas, pessoalmente, prefiro a abordagem do plugin. É muito mais fácil e com menos esforço.






1  Tenho autoridade para dizer que o  plug-in mrJar está em processo de atualização com suporte JDK14 +. O lançamento da v0.0.17 deve ser anunciado nos próximos 1 a 2 dias.