gpt4 book ai didi

java - 如何让Java不调用外部lib

转载 作者:行者123 更新时间:2023-12-01 15:14:59 27 4
gpt4 key购买 nike

我有一个用Java编写的大型系统,它基本上由用户界面、应用程序的“核心引擎”和许多其他模块组成。我正在尝试创建一个仅包含“核心引擎”的小程序,而不包含其他部分,因此我需要共享相同的代码库以跟上更新。我已经这样做了,效果很好,问题是其他部分使用了很多我不需要的外部 jar,而小程序目前需要它们。

我没有调用需要外部 jar 的代码部分,并且当我调用类的构造函数时,堆栈跟踪给了我一个错误,所以我猜测它需要 jar这个类(我正在使用构造函数)已加载。但我在互联网上读到Java仅在需要时加载类,所以我不确定这里发生了什么。有人能给我一些关于如何让它不需要这些 jar 的建议吗?

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 不在学术版中,但我可以使用相同的代码编译其他版本,而无需需要这些 jar 时遇到问题。

我知道提供帮助是一种困难的情况,但我想也许有人遇到过类似的情况并且可以给我提示。

另外,我有没有可能有这样的方法:

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

但是这个方法永远不可能让虚拟机尝试获取包含 ClassInOneOfTheJars 的 jar 吗? (据我所知,答案似乎是否定的)。

最佳答案

根据评论,发生的情况是,只有在尝试加载MyClass2时,JVM才会在搜索类路径时尝试访问less.jar。我的猜测是,类仅在第一次需要时才加载,因此 .jars/其他类路径条目仅在之前的类中找不到类时才首先访问。

解释您看到的行为的一种方法是您的类路径按以下顺序包含这些 .jar:

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

MyClass 位于 a.jar 中; MyClass2 位于 b.jar 中。类加载器尝试加载MyClass,打开a.jar,找到它并加载它,然后开始运行构造函数。构造函数需要 MyClass2,因此类加载器会打开 a.jar,但在那里找不到该类,因此会转到下一个类路径条目。这是 less.jar,无法访问,并且崩溃。当您从类路径中删除无法访问的 .jar 时,类加载器可以移至 b.jar 并在那里找到 MyClass2

关于java - 如何让Java不调用外部lib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11750539/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com