2016-03-23 8 views
1

Ich möchte eine JAR-Datei, die Ähnlichkeiten zwischen Aufgaben Etiketten findet. Aus diesem Grund verwende ich 2 Java-Bibliotheken des WordNet-Wörterbuchs: JWNL-1.4-rc3 und JWI-2.3.3. Ich habe auch im resources Ordner myProject, die properties.xml-Datei abgelegt, die von JWNL Bibliothek benötigt wird, um initialisiert zu werden, sowie die WordNet Wörterbuch:Problem mit relativen Pfaden von Ressourcen-Dateien in einem ausführbaren Jar mit Maven

src/main/resources/ 
    properties.xml 
    WordNet-3.0/dict (dict has 24 files inside) 

Die properties.xml Datei hat den Verzeichnispfad mit der Wert:

<param name="dictionary_path" value="WordNet-3.0\dict"/> 

In meinem Code habe ich die zwei Codeschnipsel unten gezeigt.

Dieser Code initialisiert die JWNL Bibliothek:

try { 
    JWNL.initialize(similarities.class.getClassLoader().getResourceAsStream("/properties.xml")); 
} 
catch (JWNLException e) { 
    e.printStackTrace(); 
} 

similarities meine Hauptklasse ist.

Dies ist der Konstruktor des Wörterbuchs JWI:

try { 
    //String path = similarities.class.getProtectionDomain().getCodeSource().getLocation().getPath(); 
    dict=new Dictionary(this.getClass().getClassLoader().getResource("WordNet-3.0\\dict")); 
    dict.open(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

Aber wenn ich eine ausführbare jar exportieren und sie in der Konsole laufen lasse, erhalte ich folgende Fehlermeldung:

net.didion.jwnl.JWNLException: Properties file invalid or not found 
at net.didion.jwnl.JWNL.initialize(JWNL.java:103) 
at com.iteforth.annotationToBPM.similarities.main(similarities.java:576) 
Exception in thread "main" java.lang.NullPointerException 
at edu.mit.jwi.data.FileProvider.<init>(FileProvider.java:191) 
at edu.mit.jwi.data.FileProvider.<init>(FileProvider.java:166) 
at edu.mit.jwi.data.FileProvider.<init>(FileProvider.java:148) 
at edu.mit.jwi.Dictionary.<init>(Dictionary.java:41) 
at com.iteforth.annotationToBPM.similarities.<init>(similarities.java:92) 
at com.iteforth.annotationToBPM.similarities.main(similarities.java:627) 

habe ich bereits öffnete meine JAR-Datei und ich habe überprüft, dass es einen resources Ordner mit der properties.xml und dem WordNet Wörterbuch gibt. Ich habe auch MANIFEST geöffnet und ich habe gesehen, dass der Klassenpfad ist: . (Punkt)

Ich habe viele Threads über dieses Problem für 3 Tage gelesen, aber nichts hat mein Problem gelöst. Ich werde jede Hilfe schätzen.

Sagen Sie mir, wenn ich etwas anderes senden muss, z. B. die POM.xml oder properties.xml Dateien.

+0

Sie _always_ müssen für null überprüfen, wenn aufzublicken eine Ressource! –

Antwort

1

Der Fehler, den Sie haben, hängt mit dem Laden der Eigenschaftendatei zusammen, aber ich denke, dass Sie einen anderen mit dem Dictionary laden bekommen werden.

  1. Für die Eigenschaftsdatei:

    JWNL.initialize(ClassLoader.getSystemResourceAsStream("properties.xml")); 
    

Seien Sie sicher, dass Ihre Datei an der Wurzel Ihres Glas befindet. Das sollte der Fall sein, wenn sich Ihre Quelldatei in src/main/resources befindet, da dies die Standardmaven-Konfiguration ist. Wenn Sie Ihre Eigenschaften-Datei in einem „Ressourcen“ Ordner in Ihrem Glas ist, wie Sie gesagt haben, werden dies:

JWNL.initialize(ClassLoader.getSystemResourceAsStream("resources/properties.xml")); 
  1. Für die Dictionnary: Die API nicht zu lesen ist so konzipiert, Wörterbuchdateien im Glas. In edu.mit.jwi.data.FileProvider an der Linie 363, würden Sie sehen:

    File directory = toFile(url); 
        if (!directory.exists()) 
         throw new IOException("Dictionary directory does not exist: " + directory); 
    

    so haben Sie sie vor Ihrem Glas zu halten, in dem Dateisystem:

    dict = new Dictionary(new File("WordNet-3.0\\dict")); 
    dict.open(); 
    

Hinweis: Natürlich ein Putting hart codierten absoluten Pfad in Ihrem Code wäre eine schlechte Idee.

Sie könnten das Dictionnary Verzeichnis im selben Verzeichnis wie Glas setzen, wenn Ihr Glas immer aus diesem Verzeichnis ausgeführt wird, und der Zugang mit einem relativen Dateipfad wie oben in Ihrem Code (siehe How does Java resolve a relative path in new File()?)

Or Sie könnte der Benutzer lassen den Verzeichnispfad mit einer Befehlszeilenargumente (https://docs.oracle.com/javase/tutorial/essential/environment/cmdLineArgs.html) oder eine environnement Variable (https://docs.oracle.com/javase/tutorial/essential/environment/env.html)

Beispiel mit einer environnement Variable konfigurieren:

  • Benutzer eine environnement Variable, für exemple definieren:

    set WORD_NET_DICTIONARY = "C:\WordNet-3.0\Dict" 
    
  • Sie diese env Variable in Ihrem Code erhalten und Ihre Bibliothek konfigurieren:

    String wordNetDicDir = System.getenv("WORD_NET_DICTIONARY"); 
    if (wordNetDicDir != null) { 
        dict = new Dictionary(new File(wordNetDicDir)); 
        dict.open(); 
    } else { 
        // throw exception or log error 
        ... 
    } 
    
+0

Danke Hugo G. Du hast mein Problem in 20 Minuten gelöst und ich habe es 3 Tage lang gesucht !!! Könnte ich noch etwas anderes fragen? Ich habe das WordNet-Wörterbuch in das Verzeichnis C: /WordNet-3.0/dict gestellt. Ich möchte diese JAR-Datei auf einer Plattform importieren und auf jedem beliebigen Computer ausführen. Ich muss ein readme txt erstellen, das warnt, WordNet-Wörterbuch in C: -Verzeichnis zu platzieren? – joan

+0

Das wäre eine schlechte Idee: Was ist, wenn Ihr Benutzer kein C-Laufwerk hat oder wenn er auf Linux oder Mac ist? Ich habe meine Antwort mit einigen Möglichkeiten aktualisiert. –

+0

Ich denke, dass die bessere Lösung für meinen Fall ist, Umgebungsvariable zu verwenden, aber ich weiß nicht, wie und ich den obigen Link nicht verstanden habe. Ich benutze eine Variable CLASSPATH mit Wert:. (Punkt) (aktuelles Arbeitsverzeichnis) und platziere es in der Datei properties.xml im Wörterbuchpfad: und im Wörterbuchkonstruktor in java: dict = neues Dictionary (neue Datei ("$ {CLASSPATH} WordNet-3.0 \\ dict")); Aber ich habe die folgenden Fehler: Die Eigenschaftendatei muss einen Wörterbuchpfad angeben und das Wörterbuchverzeichnis wird nicht beendet. Irgendeine Idee, wie man es benutzt? – joan