为什么会出现这个问题?
因为实际项目太多,包太多,管理如果没有做好严格区分好,有时候就得用技术屏蔽一下了。
如何知道某个class所在的jar包
public static void scanNativeClassJar(Class<?> clazz){
System.out.println("clazz.getSimpleName():" + clazz.getSimpleName());
System.out.println("clazz.getCanonicalName():" + clazz.getCanonicalName());//这个名字不行哦
System.out.println(clazz.getResource(clazz.getSimpleName() + ".class"));
}
输出:
clazz.getSimpleName():TestBbb
clazz.getCanonicalName():com.xxx.prac.jarloadfile.testa.TestBbb
jar:file:/D:/workjava/jar-file-load-test/test-main/lib/test-b.jar!/com/xxx/prac/jarloadfile/testa/TestBbb.class
如何读取指定jar包内的文件
参考:http://mushiqianmeng.blog.51cto.com/3970029/833649/
/**
* 从ClassPath中的Jar包读取某文件夹下的所有文件
*
* @author lihzh
* @throws IOException
* @data 2012-4-13 下午10:22:24
*/
@Test
public void testGetFilesFromJarInClassPathWithDirPath() throws IOException {
String dirPath = "conf/";
URL url = this.getClass().getClassLoader().getResource(dirPath);
Assert.assertNotNull(url);
String urlStr = url.toString();
// 找到!/ 截断之前的字符串
String jarPath = urlStr.substring(0, urlStr.indexOf("!/") + 2);
URL jarURL = new URL(jarPath);
JarURLConnection jarCon = (JarURLConnection) jarURL.openConnection();
JarFile jarFile = jarCon.getJarFile();
Enumeration<JarEntry> jarEntrys = jarFile.entries();
Assert.assertTrue(jarEntrys.hasMoreElements());
Properties props = new Properties();
while (jarEntrys.hasMoreElements()) {
JarEntry entry = jarEntrys.nextElement();
// 简单的判断路径,如果想做到想Spring,Ant-Style格式的路径匹配需要用到正则。
String name = entry.getName();
if (name.startsWith(dirPath) && !entry.isDirectory()) {
// 开始读取文件内容
InputStream is = this.getClass().getClassLoader().getResourceAsStream(name);
Assert.assertNotNull(is);
props.load(is);
}
}
Assert.assertTrue(props.containsKey("test.key"));
Assert.assertEquals("thisIsValue", props.getProperty("test.key"));
Assert.assertTrue(props.containsKey("test.key.two"));
Assert.assertEquals("thisIsAnotherValue", props.getProperty("test.key.two"));
}
项目迁移的过程中发现以前的代码维护性实在是差。 我把问题简化为以下这些简单的代码: 项目M 引用了项目 A.jar,这个A在lib目录里面 在A里面放置了一个配置文件test.properties, 就放在jar的根目录下。 A.jar |___test.properties 在M中有一段代码回去读取这个A.jar里的配置文件,简单一点就用下面这句话来调用。 Java code public class ConfigUtil { public static String getInstance() throws Exception{ String path = ConfigUtil.class.getResource("/").toString(); path = path.substring(0, path.length()-8);// System.out.println(path);//这里打印的结果显示可以拿到当前类的绝对路径 InputStream f = new FileInputStream("jar:"+path+"lib!/A.jar/"+"test.properties"); return "xxx"; } }
+
+
=
+++
=
+
+