2016-01-13 51 views
2

我以爲我對事物有把握,但顯然不是。Jar對EXE的困擾,對classpath的理解

所以我使用javac轉成名爲.java的.class

javac KFile.java

我再罐子打開類文件到一個jar文件

jar cf HPLCData.jar KFile.class

我再包了。 jar文件與launch4j,特別是保持'不包裝罐'未經檢查,爲我提供HPLCData.exe

從命令行,如果我運行的代碼與java KFile它的作品就像一個魅力。如果我運行HPLCData.exe,我得到這個運行時錯誤,這似乎與我的目錄掃描器相關聯。

Exception in thread "main" java.langNoClassDefFoundError: KFile$1 
    at KFile.addTree(KFile.java:162) 
    at KFile.main(KFile.java:48) 
Caused by java.lank.ClassNotFoundEception: KFile$1 
    at java.net.URLClassLoader.findClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass*Unknown Source) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Unkonwon Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    .... 2 more 

對我來說,這似乎是一個錯誤的東西,因爲如果我運行java腳本本身它工作正常,我做的,但是,這裏是下面的代碼的部分。我只是認爲如果我創建一個包含類的jar文件,包裝jar文件的.exe如何找不到該類?

static void addTree(Path directory, final Collection<Path> all) 
    throws IOException { 
Files.walkFileTree(directory, new SimpleFileVisitor<Path>() { 
    @Override 
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) 
      throws IOException { 
     all.add(file); 
     return FileVisitResult.CONTINUE; 
    } 
}); 

編輯

對於它的價值,我想我是瘋了,因爲有時.exe文件將在原來的目錄在我的.jar和.class文件是工作。我認爲他們有一些關係,但我開始注意到,當它工作時,我可以直觀地看到創建KFile $ 1.class文件。

我離開了這個,因爲,說實話,它使我聽起來像一個堅果,我現在不能再現它。

哦有趣。 KFile $ 1.class出現在我使用 javac KFile.class
因此,讓我嘗試只是將這些添加到我的jar文件然後。

+0

你可以運行java -jar HPLCData.jar – HRgiger

+0

'沒有主要的清單屬性,在HPLCData.jar中' – Chemistpp

回答

2

在你的.java文件中,你似乎使用匿名內部類。所以你的編譯將產生多個.class-文件。除了KFile.class會有KFile$1.class,可能KFile$2.class

所有這些都需要執行程序,但你只添加KFile.class到你的JAR文件,這樣執行從罐子的應用程序時,所有的人都沒有發現。

嘗試jar cf HPLCData.jar *.class將當前目錄中的所有類文件包括進來(如果只有當前項目中的文件最好),那麼所有內容都應該按預期工作。

+0

你說什麼是有道理的,但它必須自己管理,因爲目錄只有這一個類文件和一些apache commons的東西,但我最終沒有使用。 – Chemistpp

+0

是的,它在.class文件實際存在時有效。它是用.javac生成的,我沒注意到它何時開始這樣做。 – Chemistpp