今天在使用Java动态加载odbc Jar得到odbc驱动名字的时候,报错了,错误信息如下:
java.lang.SecurityException: sealing violation: package oracle.net.ns is sealed
at java.net.URLClassLoader.defineClass(URLClassLoader.java:227)
at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at com.huse.dyjar.得到驱动名字.getDriverName(得到驱动名字.java:47)
at com.huse.dyjar.得到驱动名字.main(得到驱动名字.java:17)
代码如下:
import java.io.File;
import java.lang.reflect.Modifier;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
public class 得到驱动名字 {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
File fs = new File("E:/新版lib/odbc15.jar");
getDriverName(fs, list);
for (String str : list) {
System.out.println(str);
}
}
public static void getDriverName(File fs, List<String> list) {
if (!fs.getName().endsWith(".zip") && !fs.getName().endsWith(".jar")) {
return;
}
try {
URLClassLoader urlClassLoader = new URLClassLoader(new URL[] { fs
.toURI().toURL() });
JarFile zip = new JarFile(fs);
Enumeration<JarEntry> enu = zip.entries();
String className;
String tempName;
while (enu.hasMoreElements()) {
JarEntry entry = (JarEntry) enu.nextElement();
if (!entry.isDirectory()) {
if ((tempName = entry.getName()).endsWith(".class")
&& tempName.indexOf("$") == -1) {
// 将驱动类路径中的/替换成.
className = tempName.substring(0,
tempName.lastIndexOf(".class")).replaceAll("/",
".");
// 这个异常一般是由于classpath中有多个jar包都包含同样的java包,比如oracle.net.ns
// sealing violation: package oracle.net.ns is sealed
if (!"".equals(className)) {
Class c = null;
c = urlClassLoader.loadClass(className);
if (java.sql.Driver.class.isAssignableFrom(c)// 判断驱动类是java.sql.Driver的子类
&& !Modifier.isAbstract(c.getModifiers())) {// 判断驱动类是否为一个抽象类
list.add(className);
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
} catch (Error ex) {
// ex.printStackTrace();
}
}
}
这个错误是因为classpath中有多个jar包都包含同样的java包,比如oracle.net.ns,说明白点就是classpath下面有类似jar存在,如odbc6.jar。
全文完。