Ciao,
On Thu, Jul 18, 2019 at 10:15 AM Federico Fissore [email protected]
[it-torino-java-jug] <[email protected]> wrote:
>
>
>
> Ciao a tutti
>
> In questi giorni sto aggiornando a java 11 e ai moduli un progetto
> opensource che feci ben 10 anni fa: jrecordbind
>
> Dopo molti tentativi, sono arrivato a qualcosa che compila e ha i test
> verdi ma solo quando girano nell'IDE!
IntelliJ (e credo altri IDE) non girano ancora i tests usando il
module-path, ma tutto nel class-path.
Maven, invece, usa il module-path in questo modo: le classi sorgenti e
le dipendenze dichiarate nel module-info sono nel module-path, le
classi di test vengono aggiunte al modulo principale via
"patch-module", e le dipendenze di test sono nel class-path.
Ovviamente il comportamento è notevolmente differente nei due casi,
quindi va bene usare l'IDE ma devi sempre verificare che Maven passi
il build.
> Se lancio "mvn clean install" da terminale, i test falliscono con un
> messaggio del tipo
>
> java.lang.IllegalAccessException: class org.fissore.jrecordbind.Utils
> (in module org.fissore.jrecordbind) cannot access class
> org.fissore.jrecordbindtests.test.MyEnumConverter (in module
> org.fissore.jrecordbindtests) because module
> org.fissore.jrecordbindtests does not export
> org.fissore.jrecordbindtests.test to module org.fissore.jrecordbind
>
> Se al module-info del modulo di test aggiungo
>
> exports org.fissore.jrecordbindtests.test to org.fissore.jrecordbind;
>
> il compilatore si arrabbia con
>
> module-info.java:[6,39] package is empty or does not exist:
> org.fissore.jrecordbindtests.test
>
> Immagino succeda perchè le classi di test sono sotto src/test invece che
> src/main
>
> Qualche anima pia ha un po' di tempo per aiutarmi a capire come uscirne?
> Il codice è su github, branch "3.0.0"
Questo è un caso particolare in cui una classe principale deve
accedere ad altre classi fuori dal suo package, ma senza dipendenza
esplicita (reflection?).
Devi pensare a cosa dovrebbe fare una applicazione per usare
jrecordbind: probabilmente nel tuo caso dovrebbe aprire se stessa a
jrecordbind.
Quindi devi fare la stessa cosa nei tests, ma modificando Surefire
Maven Plugin in questo modo:
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>
@{argLine}
--add-exports ...
</argLine>
</configuration>
</plugin>
Non ho visto in dettaglio il tuo progetto, ma puoi trovare diversi
esempi in Jetty 10.0.x e CometD 6.0.x di come ho dovuto configurare
Surefire per far funzionare i tests.
A volte serve --add-modules, altre --add-reads, altre --add-exports,
altre --add-opens, ecc.
Pensa ai tuoi tests come se fossero una applicazione esterna, e
capirai quali command line options per i moduli ti servono nella
configurazione di Surefire.
--
Simone Bordet
---
Finally, no matter how good the architecture and design are,
to deliver bug-free software with optimal performance and reliability,
the implementation technique must be flawless. Victoria Livschitz