Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it L'avatar di elilo
    Registrato dal
    Aug 2007
    Messaggi
    149

    [Java] creazione jar con riferimenti esterni

    ciao,
    ho creato un'applicazione che usa diverse librerie esterne e diversi file.

    la struttura è questa

    codice:
    com/
    icons/
    jars/
    languages/
    temp/
    config.ini
    copyright.txt
    imgHistory.xml
    main-window_icon.png
    main-wizard_icon.png
    ora io vorrei creare un jar che racchiudesse le immagini esterne e la cartella com (che contiene i file .class) e la cartella jars (che contiene le librerie esterne con le relative dll)

    mentre le altre cartelle icons, languages, temp devono restare fuori dal jar ma essere accessibili dall'applicazione tramite path relativo

    ho creato il manifest
    codice:
    Manifest-Version: 1.0
    Main-Class: com.msmfc.control.MainController
    Class-Path:
     jars/forms-1.3.0.jar
     jars/gstreamer-java.jar
     jars/GSVideo.jar
     jars/ini4j.jar
     jars/jna.jar
     jars/miglayout15-wing.jar
     jars/processing-core.jar
     jars/RXTXcomm.jar
    ho usato il comando
    codice:
    jar cvfm out.jar manifest.txt com jars main-window_icon.png main-wizard_icon.png
    ho quindi copiato il jar creato (out.jar) in una cartella con le sole cartelle e file che volevo fuori dal jar (icons, languages, temp, config.ini, copyright.txt e imgHistory.xml)

    però quando eseguo il tutto con
    codice:
    java -jar out.jar
    mi da quest'eccezione
    codice:
    Exception in thread "main" java.lang.NullPointerException
            at javax.swing.ImageIcon.<init>(ImageIcon.java:181)
            at com.msmfc.gui.MSMFCSplashScreen.setAsIcon(MSMFCSplashScreen.java:147)
    
            at com.msmfc.gui.MSMFCSplashScreen.addComponentToPane(MSMFCSplashScreen.
    java:112)
            at com.msmfc.control.MSMFCSplashScreenController.initializeGui(MSMFCSpla
    shScreenController.java:28)
            at com.msmfc.control.MainController.<init>(MainController.java:120)
            at com.msmfc.control.MainController.main(MainController.java:107)
    è come se non trovasse l'immagine per lo splash screen che ho incluso all'interno del jar elencandola durante l'esecuzione del comando
    codice:
    jar cvfm....
    sapete aiutarmi? mi perdo un riferimento nel classpath o qualcosa di simile?
    grazie
    ciao
    "Se in un primo momento
    l'idea non è assurda,
    allora non c'è nessuna speranza
    che si realizzi."
    - Albert Einstein -

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Sai che devi usare Class.getResource() per accedere a un file (immagine, testo o altro) in un jar?

    Guarda qualche esempio qui:
    http://docs.oracle.com/javase/tutori...ents/icon.html

  3. #3
    Utente di HTML.it L'avatar di elilo
    Registrato dal
    Aug 2007
    Messaggi
    149
    ok usavo già il Class.getResource(path)
    adesso ho inserito la cartella icons all'interno del jar e quell'errore si è risolto

    però adesso ottengo altre eccezioni
    codice:
    Exception in thread "Thread-3" java.lang.NoClassDefFoundError: org/ini4j/Ini
            at com.msmfc.utils.configs.ConfigsManager.readConfigs(ConfigsManager.jav
    a:21)
            at com.msmfc.control.MainController$WorkRunnable.run(MainController.java
    :286)
            at java.lang.Thread.run(Thread.java:662)
    Caused by: java.lang.ClassNotFoundException: org.ini4j.Ini
            at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
            at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
            ... 3 more
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
            at com.msmfc.control.MainController$2.run(MainController.java:264)
            at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
            at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:646)
            at java.awt.EventQueue.access$000(EventQueue.java:84)
            at java.awt.EventQueue$1.run(EventQueue.java:607)
            at java.awt.EventQueue$1.run(EventQueue.java:605)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessCo
    ntrolContext.java:87)
            at java.awt.EventQueue.dispatchEvent(EventQueue.java:616)
            at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre
    ad.java:269)
            at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.
    java:184)
            at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
    ad.java:174)
            at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    
            at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    
            at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
    la prima (quella di ini4j) è relativa a questa linea di codice
    codice:
    Ini ini = new Ini(new File(path));
    dove path punta al file config.ini che è esterno al jar (posizionato nella stessa cartella)
    quindi come posso usare dei percorsi relativi che "escano" dal jar?

    EDIT: ho provato ad inserire nel classpath del manifest sia "../" che "." come riferimento (per riferirmi alla root del progetto) ma il risultato è lo stesso
    "Se in un primo momento
    l'idea non è assurda,
    allora non c'è nessuna speranza
    che si realizzi."
    - Albert Einstein -

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    quindi come posso usare dei percorsi relativi che "escano" dal jar?
    Li puoi usare tranquillamente, con le stesse problematiche di quando i tuoi class non sono contenuti nel jar,
    ossia la path è relativa alla directory da cui lanci la vm java.
    c:\demo> java com.msmfc.control.MainController
    se il tuo file di configurazione si trova in c:\demo\config
    puoi usare una path relativa:
    new File("config/myconfig.ini")

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Re: [Java] creazione jar con riferimenti esterni

    Originariamente inviato da elilo
    ora io vorrei creare un jar che racchiudesse le immagini esterne e la cartella com (che contiene i file .class) e la cartella jars (che contiene le librerie esterne con le relative dll)
    Leggendo questo io capisco che tu vuoi impacchettare nel tuo JAR i file JAR delle librerie esterne... ho capito bene?

    Se ho capito bene, allora stai seguendo una strada sbagliata ed è probabilmente la causa di questo
    codice:
    Exception in thread "Thread-3" java.lang.NoClassDefFoundError: org/ini4j/Ini
    I JAR delle librerie esterne andrebbero messi, appunto, esterni al JAR dell'applicazione. I file JAR contenuti internamente non sono "raggiungibili" dal classloader. Ci sono 2 tecniche diverse per ottenere, comunque, ciò che vuoi (anche se a mio parere portano più svantaggi che vantaggi):

    1) Usare un classloader diverso che sia in grado di andarsi a leggere i JAR interni (esistono software di terze parti che lo fanno)

    2) Scompattare i JAR delle librerie per poi importarli all'interno del tuo JAR, esattamente come fossero parte integrante del tuo progetto.

    La seconda soluzione, in particolare, non è sempre applicabile in quanto vi possono essere dei conflitti tra i nomi delle classi e dei package delle librerie esterne.

    Consiglio, comunque, di mantenere esterni i JAR delle librerie di terze parti: questo ti facilita le operazioni di upgrade delle stesse.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Quoto LeleFT, sulle librerie pensavo sapessi cosa stavi facendo...
    Sulle path dei files come ti ho già scritto. Ciao.

  7. #7
    Utente di HTML.it L'avatar di elilo
    Registrato dal
    Aug 2007
    Messaggi
    149
    ok ho lasciato i jars esterni e funziona

    cioè funziona...è cambiata l'eccezione

    ora ho i sorgenti, le icone e le immagini per gli sfondi all'interno del jar
    è strutturato così
    codice:
      jars/
      languages/
      temp/
      config.ini
      copyright.txt
      imgHistory.xml
      
      out.jar
    eseguendo out.jar la finestra del programma si apre ma ottengo eccezioni di questo tipo
    codice:
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
            at javax.swing.ImageIcon.<init>(ImageIcon.java:181)
            at com.msmfc.gui.MSMFCSplashScreen$1.paintComponent(MSMFCSplashScreen.ja
    va:57)
            at javax.swing.JComponent.paint(JComponent.java:1029)
            at javax.swing.JComponent.paintToOffscreen(JComponent.java:5124)
            at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintMa
    nager.java:1491)
            at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:142
    2)
            at javax.swing.RepaintManager.paint(RepaintManager.java:1225)
            at javax.swing.JComponent._paintImmediately(JComponent.java:5072)
            at javax.swing.JComponent.paintImmediately(JComponent.java:4882)
            at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:786)
    
            at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:714)
    
            at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:6
    94)
            at javax.swing.RepaintManager.access$700(RepaintManager.java:41)
            at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java
    :1636)
            at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
            at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:646)
            at java.awt.EventQueue.access$000(EventQueue.java:84)
            at java.awt.EventQueue$1.run(EventQueue.java:607)
            at java.awt.EventQueue$1.run(EventQueue.java:605)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessCo
    ntrolContext.java:87)
            at java.awt.EventQueue.dispatchEvent(EventQueue.java:616)
            at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre
    ad.java:269)
            at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.
    java:184)
            at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
    ad.java:174)
            at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    
            at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    
            at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
    codice:
    Exception in thread "Thread-3" java.lang.NoClassDefFoundError: net/miginfocom/sw
    ing/MigLayout
            at com.msmfc.gui.MainWizard.generateMiScopeTab(MainWizard.java:316)
            at com.msmfc.gui.MainWizard.addComponentToPane(MainWizard.java:183)
            at com.msmfc.control.MainWizardController.initializeGui(MainWizardContro
    ller.java:56)
            at com.msmfc.control.MainController$WorkRunnable.run(MainController.java
    :323)
            at java.lang.Thread.run(Thread.java:662)
    Caused by: java.lang.ClassNotFoundException: net.miginfocom.swing.MigLayout
            at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
            at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    verificando le immagini all'interno del jar (non le icone) vengono caricate correttamente
    le librerie anche (perchè la libreria che gestisce la webcam funziona)

    le eccezioni NullPointerException non capisco perchè esca in quanto le immagini a cui accede sono all'interno del jar e le carico tramite Class.getResource(path)

    l'altra eccezione anche non la capisco, corrisponde ad un jar presente nella cartella jars esterna ad out.jar

    grazie, ciao
    "Se in un primo momento
    l'idea non è assurda,
    allora non c'è nessuna speranza
    che si realizzi."
    - Albert Einstein -

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    ora che i jars sono esterni li specifichi nel classpath nella linea di comando?

    Magari sai già, per sicurezza ti metto il link alla documentazione:
    http://docs.oracle.com/javase/7/docs...classpath.html

  9. #9
    Utente di HTML.it L'avatar di elilo
    Registrato dal
    Aug 2007
    Messaggi
    149
    ma il riferimento ai jar esterni l'ho messo nel manifest

    codice:
    Manifest-Version: 1.0
    Main-Class: com.msmfc.control.MainController
    Class-Path: jars/forms-1.3.0.jar jars/gstreamer-java.jar jars/GSVideo.jar jars/ini4j.jar jars/jna.jar jars/miglayout15-wing.jar jars/processing-core.jar jars/RXTXcomm.jar
    "Se in un primo momento
    l'idea non è assurda,
    allora non c'è nessuna speranza
    che si realizzi."
    - Albert Einstein -

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    ok
    E questo net/miginfocom/swing/MigLayout è in questo jar: jars/miglayout15-wing.jar?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.