Allora, premetto che ho faticato molto per arrivare a creare questo jar (ok molto è dovuto al fatto che non sono espertissimo per le tecnologie usate, ma ci sono riuscito...), quindi non ditemi "cambia linguaggio" perfavore.
Fatto sta che ho creato un programma java per una associazione, questo programma permette di interfacciarmi col sito ricavando delle informazioni da un file xml corredato di xsd per la validazione, legge le informazioni dall'xml e riempie una tabella, poi se è stato appena avviato (l'operazione di parsing del file xml viene avviata per forza una volta al lancio, in aggiunta l'utente la può ripetere manualmente cliccando su una voce del menu), viene visualizzato un messaggio sulla system tray (il programma ha un'icona che risiede li) che avvisa se ci sta qualcosa nella tabella, altrimenti non viene mostrato nessun messaggio e stop, il programma resta in esecuzione da solo.
Detto questo, ho aggiunto una particolare feature che consentissie al programma di avviarsi allo startup dell'intero sistema (o meglio: al login di un utente... anche perchè sennò testare diventava un omicidio): sfruttando la JNI ho creato una dll che mi consentisse di creare/leggere chiavi di registro (il programma java è fatto per girare solo sotto windows, anche perchè gli utenti finali si avvalgono solo di roba microsoft e non usano linux... se dovessero convertirsi, provvederò a creare una libreria pure per linux che tanto mi basta solo quello, non devo riscrivere tutto), il miracolo è stato che ci sono riuscito (eh si!)... ora con una simpatica checkbox, quando viene selezionata viene scritta la chiave di registro, se viene deselezionata viene rimossa (semplice no?) in aggiunta c'è una funzione per controllare se tale chiave esiste (mi serve per impostare la checkbox su selezionata o meno, all'avvio del programma).
Queste son le caratteristiche... ora il programma intero è "wrappato" usando launch4j, che crea un simpatico exe che mi avvia il file jar, mi consente di impostare un paio di cose... niente di particolare, fondamentalmente lancia il jar e basta (non mi serve che controlli la virtual machine né niente altro, a quello ci penso in fase di installazione avvalendomi di NSIS che mi pare piu che eccellente), quindi io ho messo quello come file da avviare allo startup (per intenderci nella chiave di registro è scritto il percorso all'exe, non al file jar)
Se doppioclicco sull'exe, il programma fa tutto quel che deve... è anche molto piacevole nell'insieme :P
Il problema sorge all'avvio: l'exe viene lanciato (se vado nel task manager ho sia javaw avviato che l'exe, si il wrapper si suddivide in due processi... non è assolutamente un problema per me)... l'applicazione però ha dei problemi: se provo a leggere file (mi serve per leggere le opzioni, uso le normali librerie java per questo) oppure uso la mia dll famosa, compare la finestra corredata solo della barra del titolo e dei contorni... al centro è come se fosse trasparente (si vedo quel che c'è dietro) e ovviamente non c'è nessun componente su quella trasparenza, come fosse in crash.
Provando a disattivare il lettore di opzioni e quello di chiavi di registro (sia tutti e due insieme che solo uno dei due), mi sono accorto che ENTRAMBI hanno problemi: infatti se li disattivo entrambi il programma si avvia senza il benchè minimo problema (dopodiché posso pure fare operazioni di lettura... è allo startup che non gli piace)... (se lascio attiva la parte di codice riguardo alle chiavi di registro nello stacktrace noto pure che non riesce a caricare la dll)
La cosa importante è che se chiudo il programma mentre è in questa situazione di "semicrash" e lo riapro, funziona benissimo...
La prima cosa che mi è venuta in mente è che qualcosa non venisse caricato... ho provato a mettere dei lunghi sleep (anche 40 secondi) ma niente, ho provato perfino a fare un while che ciclicamente lanciava il frame principale (se veniva rilevata un'eccezione, aspettava un secondo e provava a rilanciarlo)... dopo 1343 cicli non è successo nulla e java è andato in overhead :P
Ho provato a fare anche un'altra cosa: un exe che aspettava 40 secondi, avviava l'exe "wrapper" che avviava il file java... anche qui, stessi identici problemi di prima
Qualcuno ha idea di che può essere e se c'è un modo per ovviare a tutto ciò?
P.S.
Mi viene restituito il seguente errore se provo ad avviare il programma allo startup (La lettura delle configurazioni disabilitata, mantengo invece la possibilità di interfacciarmi con la dll)
Sottolineo che AutoStartChecker sta felicemente all'altezza del jar, tant'è che se poi lo avvio "a mano" funziona tutto bene...Codice PHP:
Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: no AutoSt
artChecker in java.library.path
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at core.AutoStartChecker.<clinit>(AutoStartChecker.java:35)
at gui.Home.<init>(Home.java:72)
at cittanascostauc.Main$1.run(Main.java:22)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
P.P.S.
Questo succede invece se tengo il programma con tutte le sue funzionalità (compresa la lettura file)
Da un errore... ma suppongo che semplicemente sia la conseguenza di una catena di errori (Sembrerebbe come se non venissero caricate le dll dalla jvm, difatti tutto ciò che si interfaccia con metodi "native" non funziona (compresa scrittura file)
Codice PHP:
Problemi nella creazione della GUI: null
java.lang.NumberFormatException: null
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.<init>(Unknown Source)
at gui.Home.<init>(Home.java:52)
at cittanascostauc.Main$1.run(Main.java:22)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)