2016-06-01 1 views
0

Ich habe ein Projekt, das aus eclplse und einer Java-Klasse, die Haupt-Methode läuft gut, aber scheitern zu laufen, wenn ich versuche, es von IDEA auszuführen.FileNotFoundException: file: xxx .m2 repository xxxx xxx xxx.jar! Dateiname, wenn ich main von IDEA

Die wichtigste Methode wird zunächst versuchen, eine Eigenschaft von classbath von unten Code von ANOTHER Abhängigkeit Projekt (wemq-Client-Datei) zu laden:

filePath = this.getClass().getClassLoader().getResource(fileName).getPath(); 
....//something else 

prop = new Properties(); 
prop.load(new FileInputStream(new File(filePath))); 

Aber wenn ich in InteliJ laufen, ich habe folgende Fehler :

Exception in thread "main" java.lang.ExceptionInInitializerError 
    at ..... 
Caused by: java.lang.RuntimeException: java.io.FileNotFoundException: file:\C:\Users\jaskeylin\.m2\repository\cn\webank\wemq\wemq-client\0.1.3\wemq-client-0.1.3.jar!\wemq-client.properties (文件名、目录名或卷标语法不正确。) 

die 文件名、目录名或卷标语法不正确。 Dateinamen oder Wörterbuch Namenssyntax nicht korrekt bedeutet.

Wir können aus dem Fehler statck sehen, dass es versucht, diese Datei aus Maven Repos Paket JAR-Datei zu finden. Warum das? Wie kann ich es reparieren.

PS: Wenn Sie vorschlagen ich den Code ändern, bitte auch erklären, warum dies von Eclipse funktioniert, da dies aus meiner teamates recht gut funktioniert, gibt es mir nur die IDEA

Antwort

0

zu verwenden, hofft, dass Sie nicht Fileinputstream verwenden können zu lesen, Dateien im Glas, können Sie someclass.class.getResourceAsStream(name) mit der Datei

nur

prop = new Properties(); 
prop.load(this.getClass().getResourceAsStream(fileName)); 
+0

Das wird ein Ressourcen-Leck verursachen. – Andreas

0

Wenn Sie die Klasse von einem Application Server zu lesen, werden geladen, so benutzen Sie Ihr sollte Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName) anstelle von this.getClass().getClassLoader().getResourceAsStream(fileName). this.getClass().getResourceAsStream() wird auch funktionieren.

Lesen Sie this article für detailliertere Informationen zu diesem speziellen Problem.

-1

Sie können HTTPSERVLETREQUEST verwenden, um den Dateipfad abzurufen.

HttpServletRequest Anfrage = ServletActionContext.getRequest();

Zeichenfolge filePath = request.getSession(). GetServletContext(). GetRealPath ("/") + Dateiname;

+0

Datei existiert in einer JAR-Datei, d. H. Im Klassenpfad. Es ist keine Servlet-Ressource. – Andreas

+0

okay. Sie können diese JAR-Datei separat in der Deployment-Assembly hinzufügen und es erneut versuchen – PriVictor

1

Wie Sie aus dem Dateinamen in der Fehlermeldung zu sehen, Sie versuchen Datei wemq-client.properties innerhalb Datei zu öffnen wemq-client-0.1.3.jar ein FileInputStream verwenden. Das kannst du nicht tun. Sie können nur echte Dateien im Dateisystem öffnen, nicht Dateien in Archiven.

Kurz gesagt, NIEMALS tun getResource(...).getPath(). Es gibt einen Grund, warum die Methode getResource(String) eine URL zurückgibt und nicht eine File. Da die Ressource nicht eine Datei sein kann.

Verwenden Sie stattdessen getResourceAsStream(String) und geben Sie direkt an die load(InputStream) Methode.

Wie immer, denken Sie daran, Ihre Ressourcen zu schließen, vorzugsweise mit Try-mit-Ressourcen.

prop = new Properties(); 
try (InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(fileName)) { 
    prop.load(inputStream); 
} 

Oder nutzen Sie jede alternative Version von getResourceAsStream() wie in answer by @SanjitKumarMishra vorgeschlagen.

Sie können verwenden, um die getResource(String) Methode, wenn Sie wollen, aber Sie müssen dann den Stream öffnen Sie die URL.openStream() Methode.

URL fileUrl = this.getClass().getClassLoader().getResource(fileName); 
....//something else 

prop = new Properties(); 
try (InputStream inputStream = fileUrl.openStream()) { 
    prop.load(inputStream); 
} 

Der Grund ist es in Eclipse funktioniert, ist, dass man direkt aus Dateien auf dem Dateisystem laufen lassen, aber wenn Sie Ihren Code verpacken und implementieren, ist es in JAR-Dateien verpackt, und Sie erhalten den Fehler, den Sie sehen, .