0

希望有人可以帮助我。

据我了解,使用 ClassLoader 是加载内容的最可靠方式。

public class Pipeline{
   public static URL getResource(String filename) {
      return ClassLoader.getSystemResource(filename);
   }

   public static InputStream getResourceAsStream(String filename) {
      return ClassLoader.getSystemResourceAsStream(filename);
   }
}

如果您在“[jar bundle]/resources/abc.png”中有一个文件..您可以通过以下方式加载它:

URL url = Pipeline.getResource("resources/abc.png"); 

加载很简单。
储蓄是我的动力。

我有一个程序在运行时收集数据,在退出时保存该数据,然后在下次加载数据并继续添加。

我认为最简单的解决方案是保存回 jar 包中,以便 ClassLoader 可以获取它们。这甚至可能吗?还是推荐?

我不介意将我的资源放在 jar 之外,只要我不必求助于“文件”来获取它们并保存到它们。(除非它可以干净地完成)

folder/application.jar

folder/resources/abc.png

如果您可以 ../ 从 ClassLoader 正在查找的位置返回一个,那么从实际包含 jar 文件的目录中干净地获取数据将很容易

Pipeline.getResource("../resources/abc.png");

有任何想法吗?

4

1 回答 1

1

这并不是类加载器的真正用途。从类加载器加载资源意味着您可以将应用程序捆绑为一个包,并且组件可以相互读取,而不必担心您要部署到的系统是如何设置的。

如果 JAR 中的文件打算由应用程序更改,那么它不是应用程序的一部分,因此可能不应该在 JAR 中。

我在您的应用程序上没有很多上下文,但希望我的建议对您的情况有效。

我建议在您的应用程序中设置一个要求,即它具有允许对其进行读写的工作区,并接受指定此目录所在位置的配置设置。在 Java 中执行此操作的典型方法是使用环境变量、系统属性或 JNDI 设置(用于容器部署)。

例子:

  1. Tomcat 的启动脚本会确定它的安装位置并设置名为 catalina.home 的系统属性,并允许您使用名为 CATALINA_HOME 的环境变量覆盖它。
  2. JBoss 查找 JBOSS_HOME
  3. Java 应用程序服务器通常会查找 JAVA_HOME 来查找 JDK。
于 2013-03-07T20:51:09.493 回答