我有一个用 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 = new MyClass2();
所有其他 FileNotFoundException 跟踪都是相同的,但缺少其他文件。另外,在这个系统上,我有多个版本(例如学术版和商业版),并且很多需要的 jar 不在学术版中,但我可以使用相同的代码编译其他版本,而无需需要这些罐子时遇到问题。
我知道提供帮助是一种艰难的情况,但我认为也许有人处于类似情况并且可以给我一个提示。
另外,有没有可能我有一些方法,比如:
public void myMethod() {
ClassInOneOfTheJars c = new ClassInOneOfTheJars();
}
但这种方法永远不可能让虚拟机尝试获取包含 ClassInOneOfTheJars 的 jar?(据我所知,答案似乎是“不”)。