`
53873039oycg
  • 浏览: 826002 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Java异常sealing violation: package oracle.net.ns is sealed

    博客分类:
  • java
 
阅读更多

     今天在使用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。

 

   全文完。

 

0
2
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics