[英]JAR not on classpath, force classloader to read file from it
我试图从传递给方法的jar文件中的文件读取类名,并将确定的类名放入传递的StringBuilder中。
对于驱动程序文件jtds-1.3.1.jar
我应该获取net.sourceforge.jtds.jdbc.Driver
但是我要获取sun.jdbc.odbc.JdbcOdbcDriver
而不是独立于传递的文件。 我想子类加载器从/META-INF/services/java.sql.Driver
中读取,该文件位于我的类路径上的某个位置(但我真的不知道在哪里),而且我不知道该如何管理该类加载器。
有关此问题的代码如下:
public String determineAndSetDriverClass(File jar, StringBuilder classNameBuilder)
{
BufferedReader br = null;
URLClassLoader child = null;
try
{
URL[] urls = {jar.toURI().toURL()};
child = new URLClassLoader(urls, this.getClass().getClassLoader());
br = new BufferedReader(new InputStreamReader(child.getResourceAsStream("/META-INF/services/java.sql.Driver")));
classNameBuilder.append(br.readLine());
return null;
}
catch (Exception e)
{
e.printStackTrace();
return e.getMessage();
}
finally
{
try
{
if (br != null)
br.close();
if (child != null)
child.close();
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
}
}
根据getResource方法的javadoc :“此方法将首先在父类加载器中搜索资源;” 似乎getResourceAsAstream
具有相同的行为。
播种如何强制从子类加载器加载?
在同一个Java程序中可以有多个jdbc驱动程序,这没有什么不对。 您是否尝试过ClassLoader.getResourceUrls()
(它将返回所有匹配的URL)? 然后您可以找到想要的那个。
另外,那些META-INF文件实际上是ServiceLoader机制的一部分,因此使用该类可能会更好。
最后,如果您只是尝试使用jdbc驱动程序,则无需执行任何操作。 您只需要创建一个具有正确URL的驱动程序,并且jdbc框架会自动找到正确的驱动程序(如果它已在类路径中)。
更新:
如果您打算检查特定的 jar文件,那么您不应该使用ClassLoader,因为它会执行所有您不需要的事情。 只需使用JarFile检查jar并提取所需的信息即可。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.