2017-05-31 106 views
1

我正在用Jython製作一個Maven項目。在Eclipse中它運行良好,,但是當我運行導出的jar時,它會發出異常。Jar無法加載包含類文件的文件夾

這是我的目錄裏面src/main/resources

src/main/resources: 
    mylib 
     file_one.py 
     file_two.py 
    pylib 
     sys.py 
     sys$py.class 
     os.py 
     os$py.class 
     ... 

我一直在試圖加載我的文件夾pylib含有的類文件src/main/resources這個代碼片段:

public class MyClass { 

    // ... 

    public static void init() { 
     // ... 
     ClassLoader classLoader = Prompt.class.getClassLoader(); 
     addToPath(path, classLoader.getResource("mylib").getPath()); 
     System.out.println("Found mylib"); 
     addToPath(path, classLoader.getResource("pylib").getPath()); 
     System.out.println("Found pylib"); 
     // ... 
    } 

    // ... 

} 

雖然出口到罐子我得到這個錯誤

JAR export finished with warnings. See details for additional information. 
    Problem writing project/src/main/resources/.DS_Store to JAR: duplicate entry: .DS_Store 
    duplicate entry: .DS_Store 

我測試了多次,但該jar只包含文件夾mylib,不包含類文件。如果我包括pylib我得到這個錯誤:

java.lang.NullPointerException 
    at *project*.Prompt.init(Prompt.java:53) 
    at *project*.Prompt.start(Prompt.java:76) 
    at *project*.Main.main(Main.java:6) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58) 
Exception in thread "main" java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58) 

Note: I replaced my group id with *package* to hide the identity of my project.

有誰知道如何加載的類文件?

Edit:

  • Corrected code by adding semicolons.
  • Added println expression to make clear where the executed jar failed.
  • Added path information.
  • Changed class and project name.
  • Added export error.
  • Extended runtime error
+1

你想加載java中的python文件嗎? – screenmutt

+0

是的,我使用Jython – Dylan

+0

檢查'pylib'是否在JAR文件中(jar -tvf project.jar) –

回答

0

該問題必須是如何創建JAR文件或其中包含的內容。

我只做了一個大部分最小的完整樣本。適用於Eclipse,Windows命令提示符,Git Bash和SUSE Linux!

目錄結構:

./bin 
./bin/classes 
./bin/classes/project 
./bin/classes/project/Prompt.class 
./bin/classes/pylib 
./bin/classes/pylib/file.txt 
./py.jar 
./py.jardesc 
./src 
./src/java 
./src/java/project 
./src/java/project/Prompt.java 
./src/java/pylib 
./src/java/pylib/file.txt 

Prompt.java:

package project; 

import java.io.IOException; 
import java.io.InputStream; 
import java.net.URL; 

public class Prompt { 

    public static void main(String[] args) { 
     ClassLoader cl = Prompt.class.getClassLoader(); 
     URL url; 
     url = cl.getResource("pylib"); 
     System.out.println(url); 

     url = cl.getResource("pylib/file.txt"); 
     System.out.println(url); 
     try (InputStream in = url.openStream()) { 
      int ch; 
      while ((ch = in.read()) != -1) { 
       System.out.print((char) ch); 
      } 
      System.out.println(); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 

file.txt的(測試):由日食JAR導出嚮導用下列設置創建

Just a test 

JAR :

  1. 選擇資源出口:「項目」 和「pylib」目錄
  2. 激活「導出生成的類文件和資源
  3. 選擇選項‘添加目錄條目’
  4. 選擇」生成清單文件「
  5. 進入」項目。提示」作爲主類

的JAR的含量(第一行是提示和命令來生成列表):

$ jar -tvf py.jar 
    53 Fri Jun 02 07:42:02 UTC 2017 META-INF/MANIFEST.MF 
    0 Fri Jun 02 07:34:10 UTC 2017 pylib/ 
    11 Fri Jun 02 07:34:20 UTC 2017 pylib/file.txt 
    0 Fri Jun 02 07:36:34 UTC 2017 project/ 
    1480 Fri Jun 02 07:41:54 UTC 2017 project/Prompt.class 

由其執行:

  1. 的Eclipse:運行as> Java應用程序
  2. DOS /命令提示符:java -jar py.jar
  3. DOS /命令提示符:java -cp py.jar project.Prompt
  4. 混帳擊:Java的罐子py.jar
  5. 混帳擊:java命令py.jar project.Prompt
  6. 的SUSE Linux,不同的計算機,空文件夾:Java的罐子py.jar
  7. 的SUSE Linux ,不同的計算機的空文件夾:JAVA -cp py.jar project.Prompt

它產生幾乎相同的輸出爲所有上述情況中,只是該路徑是不同的:

Eclipse:

file:/C:/DEVELOP/ECLIPSE/test/bin/classes/pylib 
file:/C:/DEVELOP/ECLIPSE/test/bin/classes/pylib/file.txt 
Just a test 

DOS prompt, Git Bash:

jar:file:/C:/DEVELOP/ECLIPSE/test/py.jar!/pylib 
jar:file:/C:/DEVELOP/ECLIPSE/test/py.jar!/pylib/file.txt 
Just a test 

SUSE Linux:

jar:file:/home/user/pytest/py.jar!/pylib 
jar:file:/home/user/pytest/py.jar!/pylib/file.txt 
Just a test 

在Windows上用Java 8編譯並執行;在SUSE Linux上使用Java 9執行。

+0

'file.txt'僅用於測試對文件的訪問(我知道我可以/應該使用緩衝區來讀取它...) –

+0

您的設置幾乎可以做一點改變:**選擇選項「導出所有輸出文件夾以檢查項目」**!現在唯一發生的事情是我的'jython-2.7.0.jar'找不到路徑中的資源。我將嘗試更改'jython-2.7.0.jar/META-INF/MANIFEST.MF'來檢測'project/resources'文件夾。 – Dylan

+0

上面的方法也不起作用。 – Dylan