22

在我的应用程序中,我以这种方式加载资源:

WinProcessor.class.getResource("repository").toString();

这给了我:

file:/root/app/repository   (and I replace "file:" with empty string)

当我从 IDE 运行我的应用程序时,这工作正常,但是当我运行我的应用程序的 jar 时:

java -jar app.jar

路径变为:

jar:/root/app.jar!/repository

有没有办法解决这个问题?

我将使用“存储库”目录名称来创建它:

ConfigurationContext ctx = (ConfigurationContext) ConfigurationContextFactory.createConfigurationContextFromFileSystem(repositoryString, null);

以同样的方式,我会得到一个文件名(而不是一个目录),我会这样使用它:

System.setProperty("javax.net.ssl.trustStore", fileNameString)
4

3 回答 3

35

听起来您正在尝试使用 aFileInputStream或类似的东西加载资源。不要那样做:而不是调用getResource,调用getResourceAsStream并从中读取数据。

(您可以改为从 URL 加载资源,但调用getResourceAsStream更方便一些。)

编辑:看到您更新的答案后,似乎其他代码位依赖于文件系统中物理单个文件中的数据。因此,答案是首先不要将它捆绑在一个 jar 文件中。你可以检查它是否在一个单独的文件中,如果不把它解压到一个临时文件中,但这在 IMO 中是相当 hacky 的。

于 2009-02-22T12:04:04.357 回答
8

使用 运行代码时java -jar app.jar,java 仅使用 JAR 文件清单中定义的类路径(即Class-Path属性)。如果该类位于 中app.jar,或者该类位于 JAR 清单的属性中设置的类路径中Class-Path,则可以使用以下代码片段加载该类,其中className是完全限定的类名。

final String classAsPath = className.replace('.', '/') + ".class";
final InputStream input = ClassLoader.getSystemResourceAsStream( path/to/class );

现在,如果该类不是 JAR 的一部分,并且不在清单中Class-Path,那么类加载器将找不到它。相反,您可以使用URLClassLoader, 小心处理 windows 和 Unix/Linux/MacOSX 之间的差异。

// the class to load
final String classAsPath = className.replace('.', '/') + ".class";

// the URL to the `app.jar` file (Windows and Unix/Linux/MacOSX below)
final URL url = new URL( "file", null, "///C:/Users/diffusive/app.jar" );
//final URL url = new URL( "file", null, "/Users/diffusive/app.jar" );

// create the class loader with the JAR file
final URLClassLoader urlClassLoader = new URLClassLoader( new URL[] { url } );

// grab the resource, through, this time from the `URLClassLoader` object
// rather than from the `ClassLoader` class
final InputStream input = urlClassLoader.getResourceAsStream( classAsPath );

在这两个示例中,您都需要处理异常,以及输入流null是否找不到资源这一事实。另外,如果你需要InputStream进入一个byte[],你可以使用 Apache 的 commons IOUtils.toByteArray(...)。而且,如果你想要一个Class,你可以使用类加载器的defineClass(...)方法,它接受byte[].

您可以在 Diffusive 源代码中的一个类中找到此代码ClassLoaderUtils,您可以在 SourceForge 的 github.com/robphilipp/diffusive 上找到该代码

以及一种从相对路径和绝对路径为 Windows 和 Unix/Linux/MacOSX 创建 URL 的方法RestfulDiffuserManagerResource.createJarClassPath(...)

于 2012-12-07T23:41:02.590 回答
5

构造 a ,然后您可以使用该方法URL加载资源(甚至在 jar 文件中) 。openStream

于 2009-02-22T12:03:19.567 回答