2012-07-31 84 views
0

我有一個Java中的大型系統,其中basicaly由用戶界面,應用程序的「核心引擎」和許多其他模塊組成。 我正在嘗試創建一個只包含「核心引擎」而不包含其他部分的小程序,因此我需要共享相同的代碼庫以跟上更新。 我已經做到了這一點,它的效果很好,問題在於我不需要使用其他部分中使用的很多外部jar,而且applet目前需要它們。如何使Java不調用外部庫

我不調用需要外部jar的代碼部分,並且當我調用一個類的構造函數時,堆棧跟蹤給我一個錯誤,所以我猜測它需要儘快使用jar因爲這個類(我使用構造函數)被加載。但是我在互聯網上看過,Java只在需要時才加載類,所以我不確定這裏發生了什麼。有誰能給我一些建議,我該如何讓它不需要這些罐子? PS:我確定最好的方法是重構它,將功能分成清晰的圖層,這樣我就可以更輕鬆地解決這個問題。問題在於,這是一個非常古老而龐大的代碼庫,正在進行這種大規模重構(儘管我想)現在不可行。

編輯 - 加入堆棧跟蹤的一個和更多信息:

java.io.FileNotFoundException: http://localhost:3000/applet/jess.jar 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source) 
    at com.sun.deploy.net.DownloadEngine.getJarFileWithoutCache(Unknown Source) 
    at com.sun.deploy.net.DownloadEngine.downloadJarFileWithoutCache(Unknown Source) 
    at sun.plugin.PluginURLJarFileCallBack$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.plugin.PluginURLJarFileCallBack.retrieve(Unknown Source) 
    at sun.net.www.protocol.jar.URLJarFile.retrieve(Unknown Source) 
    at sun.net.www.protocol.jar.URLJarFile.getJarFile(Unknown Source) 
    at sun.net.www.protocol.jar.JarFileFactory.get(Unknown Source) 
    at sun.net.www.protocol.jar.JarURLConnection.connect(Unknown Source) 
    at sun.plugin.net.protocol.jar.CachedJarURLConnection.connect(Unknown Source) 
    at sun.plugin.net.protocol.jar.CachedJarURLConnection.getJarFileInternal(Unknown Source) 
    at sun.plugin.net.protocol.jar.CachedJarURLConnection.getJarFile(Unknown Source) 
    at com.sun.deploy.security.DeployURLClassPath$JarLoader.getJarFile(Unknown Source) 
    at com.sun.deploy.security.DeployURLClassPath$JarLoader.access$1000(Unknown Source) 
    at com.sun.deploy.security.DeployURLClassPath$JarLoader$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.deploy.security.DeployURLClassPath$JarLoader.ensureOpen(Unknown Source) 
    at com.sun.deploy.security.DeployURLClassPath$JarLoader.<init>(Unknown Source) 
    at com.sun.deploy.security.DeployURLClassPath$3.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.deploy.security.DeployURLClassPath.getLoader(Unknown Source) 
    at com.sun.deploy.security.DeployURLClassPath.getLoader(Unknown Source) 
    at com.sun.deploy.security.DeployURLClassPath.getResource(Unknown Source) 
    at sun.plugin2.applet.Plugin2ClassLoader$2.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.plugin2.applet.Plugin2ClassLoader.findClassHelper(Unknown Source) 
    at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source) 
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source) 
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source) 
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at my.package.MyClass.<init>(MyClass.java:187) 
    at my.package.MyApplet.start(MyApplet.java:38) 
    at com.sun.deploy.uitoolkit.impl.awt.AWTAppletAdapter.start(Unknown Source) 
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

MyClass的線187僅僅是: MyClass2 OBJ =新MyClass2();

所有其他FileNotFoundException跟蹤都是相同的,但缺少其他文件。 此外,在這個系統上,我有不止一個發行版(學術和商業版本,例如),許多所需的罐子不在學術版本中,但我可以使用相同的代碼編譯其他版本沒有問題需要這些罐子。

我知道是一種艱難的情況給予幫助,但我雖然也許有人已經處於類似的情況,並可以給我一個提示。

此外,有沒有任何機會這一事實,我有這樣一些方法:

public void myMethod() { 
ClassInOneOfTheJars c = new ClassInOneOfTheJars(); 
} 

但絕不可以將這個方法可以使VM嘗試獲取包含ClassInOneOfTheJars罐子? (據我所讀,似乎答案是'不')。

+1

如果您正在獲取ClassNotFoundExceptions是因爲您顯然確實正在使用有問題的類。如果你認爲你不需要它們,那麼你爲什麼要實例化它們?我想不看代碼只有你可以回答。 – 2012-07-31 23:33:42

+1

沒有更多細節和堆棧跟蹤,任何人都無法提供幫助。 – 2012-07-31 23:34:13

+0

它實際上是一個FileNotFoundException(如果我把文件放在那裏,一切運行良好,但我不應該需要這些文件,這就是問題所在)。 添加了一個示例堆棧跟蹤。 – 2012-08-01 00:00:49

回答

1

根據評論,發生的事情是,只有當試圖加載MyClass2時,JVM嘗試並在搜索類路徑時訪問less.jar。我的猜測是,只有在第一次需要時才加載類,所以.jar s /其他類路徑條目只有在前一個類中找不到類時纔會首先訪問。解釋你看到的行爲

的一種方法是,你的類路徑中包含以下順序對這些.jar S:

  1. a.jar(本地)
  2. less.jar(遠程)
  3. b.jar(本地)

其中MyClassa.jar; MyClass2b.jar。類加載器嘗試加載MyClass,打開a.jar,在那裏找到並加載它,然後開始運行構造函數。構造函數需要MyClass2,所以類加載器打開a.jar,在那裏找不到類,然後轉到下一個類路徑條目。這是less.jar,這是無法訪問,你會得到崩潰。當您從類路徑中移除不可訪問的.jar時,類加載器可以移至b.jar,並在那裏找到MyClass2

+0

這很有道理。這就是爲什麼我同時獲得所有FileNotFoundExceptions的原因。 謝謝:) – 2012-08-01 12:06:45

0

原因是MyClass2使用less.jar中的某些東西,從而導致錯誤。

0

通知線路

at my.package.MyClass.<init>(MyClass.java:187) 

這意味着MyClass類型的對象被初始化。我打賭,第187行是一個內聯的構造函數調用,構造函數體內的一行,或者默認的字段值初始化。

初始化最終試圖加載jess.jar中的東西,這就是導致錯誤的原因。