当使用
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之间的差异。
final String classAsPath = className.replace('.', '/') + ".class";
final URL url = new URL( "file", null, "///C:/Users/diffusive/app.jar" );
final URLClassLoader urlClassLoader = new URLClassLoader( new URL[] { url } );
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(...)
中。