- 22,946
- 11,581
- CPU
- 1-Neurone
- Dissipatore
- Ventaglio
- RAM
- Scarsa
- Net
- Segnali di fumo
- OS
- Windows 10000 BUG
Premessa:
to sviluppando una piccola utility desktop usando:
Il problema è nato quando ho tentato di generare il jar finale (artifact) per la distribuzione:
per le versioni di Java successive alla 8, gli sviluppatori devono distribuire il "prodotto" finale come unità indipendente, in pratica gli IDE generano l'artifact che contiene già tutto (moduli runtime Java+JavaFX e, per Windows, un file .exe per Windows con cui avviare l'applicazione).
Affinché ciò avvenga però è necessario un generatore di build (dopo rapida ricerca ho optato per Gradle che a quanto pare sia il meglio disponibile).
Problema:
la stuttura di directory pensata per applicazioni non modulari non funziona per i progetti modulari: così ho generato un progetto Gradle (la versione integrata in intellij IDEA dovrebbe essere la 6.8, almeno così mi sembra di capire dal file che allego).
Nello specifico esiste una directory chiamata resources dove si dovrebbero inserire i file utili per l'applicazione, per esempio le immagini.
E qui viene il problema: dentro la cartella resources ho creato una sottocartella img con una struttura di sottodirectory che contengono immagini ma qualunque path di cartelle passi come parametro, il metodo Java getClass().getResourceAsStream(percorsoFileImmagine) mi restituisce null;
ho provato tutti i percorsi ragionevoli e pure quelli irragionevoli, come
/img/bottoni/search.png (percorso assoluto che è quello che ha sempre funzionato)
img/bottoni/search.png
./img/bottoni/search.png
/img/bottoni/search.png
search.png (ho messo direttamente il singolo file direttamente in resources, niente da fare)
La cosa strana è che se ci metto un file di database (sqlite) ed il relativo driver in formato .jar, vengono tranquillamente visti ed usati, ma per le immagini niente!
Quindi c'è qualcosa che mi sfugge:
la mia ipotesi è che il metodo Java precedentemente citato NON vada nella directory giusta, questa è la struttura generata dalla compilazione nella directory build:
La cartella con le risorse viene ricreata con tutti i file di immagine all'interno ma le classi .class evidentemente non vi accedono, nel senso che evidentemente il metodo getClass().getResourceAsStream(percorsoFileImmagine) non va affatto lì dentro ma si aspetterebbe qualcosa nella stessa directory dei file compilati .class
Qui le cose sono due:
1. o il metodo Java che sto usando per "pescare" le immagini non è quello corretto
2. oppure dovrei metter mano al file di configurazione di Gradle (lo allego) per dirgli di fare qualcosa tipo ricreare la directory img all'interno di quella coi .class (la cosa però non mi va giù, a cosa diavolo serve avere una directory da cui prelevare le risorse se poi ce le devo copiare "a mano"?
Cioè insomma, con uno strumento moderno mi aspetterei che il lavoro si semplificasse invece che complicarsi.
Questo è il file di configurazione build.gradle:
questo invece è gradle-wrapper.properties (da cui deduco la versione di Gradle)
Quindi la domanda è: come fare per pescare le immagini?
Qui sotto l'immagine di come dovrebbero essere i bottoni:
to sviluppando una piccola utility desktop usando:
- Intellij IDEA community Edition, in ultima versione
- Java 11 come linguaggio di programmazione
- JavaFX 11 come librerie grafiche
Il problema è nato quando ho tentato di generare il jar finale (artifact) per la distribuzione:
per le versioni di Java successive alla 8, gli sviluppatori devono distribuire il "prodotto" finale come unità indipendente, in pratica gli IDE generano l'artifact che contiene già tutto (moduli runtime Java+JavaFX e, per Windows, un file .exe per Windows con cui avviare l'applicazione).
Affinché ciò avvenga però è necessario un generatore di build (dopo rapida ricerca ho optato per Gradle che a quanto pare sia il meglio disponibile).
Problema:
la stuttura di directory pensata per applicazioni non modulari non funziona per i progetti modulari: così ho generato un progetto Gradle (la versione integrata in intellij IDEA dovrebbe essere la 6.8, almeno così mi sembra di capire dal file che allego).
Nello specifico esiste una directory chiamata resources dove si dovrebbero inserire i file utili per l'applicazione, per esempio le immagini.
E qui viene il problema: dentro la cartella resources ho creato una sottocartella img con una struttura di sottodirectory che contengono immagini ma qualunque path di cartelle passi come parametro, il metodo Java getClass().getResourceAsStream(percorsoFileImmagine) mi restituisce null;
ho provato tutti i percorsi ragionevoli e pure quelli irragionevoli, come
/img/bottoni/search.png (percorso assoluto che è quello che ha sempre funzionato)
img/bottoni/search.png
./img/bottoni/search.png
/img/bottoni/search.png
search.png (ho messo direttamente il singolo file direttamente in resources, niente da fare)
La cosa strana è che se ci metto un file di database (sqlite) ed il relativo driver in formato .jar, vengono tranquillamente visti ed usati, ma per le immagini niente!
Quindi c'è qualcosa che mi sfugge:
la mia ipotesi è che il metodo Java precedentemente citato NON vada nella directory giusta, questa è la struttura generata dalla compilazione nella directory build:
La cartella con le risorse viene ricreata con tutti i file di immagine all'interno ma le classi .class evidentemente non vi accedono, nel senso che evidentemente il metodo getClass().getResourceAsStream(percorsoFileImmagine) non va affatto lì dentro ma si aspetterebbe qualcosa nella stessa directory dei file compilati .class
Qui le cose sono due:
1. o il metodo Java che sto usando per "pescare" le immagini non è quello corretto
2. oppure dovrei metter mano al file di configurazione di Gradle (lo allego) per dirgli di fare qualcosa tipo ricreare la directory img all'interno di quella coi .class (la cosa però non mi va giù, a cosa diavolo serve avere una directory da cui prelevare le risorse se poi ce le devo copiare "a mano"?
Cioè insomma, con uno strumento moderno mi aspetterei che il lavoro si semplificasse invece che complicarsi.
Questo è il file di configurazione build.gradle:
Codice:
plugins {
id 'java'
id 'application'
id "org.openjfx.javafxplugin" version "0.0.10"
}
group 'org.bat'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
}
javafx {
version = "11.0.2"
modules = ['javafx.controls', 'javafx.fxml']
}
mainClassName = 'blam.Blam'
test {
useJUnitPlatform()
}
Codice:
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.8-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Quindi la domanda è: come fare per pescare le immagini?
Qui sotto l'immagine di come dovrebbero essere i bottoni: