Compreender erros com módulos JPMS
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
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.