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

Reply via email to