打包成jar后的文件读取问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/iteye_8770/article/details/82075930
打包成JAR后的配置文件读取方式和没打包的不一样,
为了兼容两种模式,
1、spring配置文件中引用属性文件方法
bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
<property name="locations">
<list>
<value>file:**/config/pos_jdbc.properties</value>
</list>
</property>
</bean>

用file:**让spring去查找文件

2、手工读取spring配置文件的方法,如SpringUtils中

private static ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath*:config/applicationContext_Pos.xml");


3、读取文件时应该区分文件在jar中还是jar的同级目录中,如图片等,一般是不打包到jar中,这么读取文件

/**
* 获取项目的文件的输入流,如果项目在jar中,则先在jar中查找文件,找不到再到jar外面查找文件
* @param filePath
* @return
* @throws IOException
*/
public static InputStream getProjectFile(String filePath) throws IOException
{
InputStream in = null;

String currentJarPath = URLDecoder.decode(Constants.class
.getProtectionDomain().getCodeSource().getLocation().getFile(),
"UTF-8"); // 获取当前Jar文件名
String path = Constants.class.getResource("").getPath();
if (path.indexOf("!") != -1)
{// 在jar中
logger.info(filePath + " is in jar");
JarFile currentJar = new JarFile(currentJarPath);
JarEntry dbEntry = currentJar.getJarEntry(filePath);
if (dbEntry != null)
in = currentJar.getInputStream(dbEntry);
}
if (in == null)
{
// String loaderPath =
// Thread.currentThread().getContextClassLoader().getResource("").getPath();
logger.info(filePath + " is not in jar");
String loaderPath = currentJarPath;
String packPath = Constants.class.getPackage().toString();
packPath = packPath.replace("package ", "");
packPath = "/" + packPath.replace(".", "/");
if (!loaderPath.endsWith("/"))
loaderPath = loaderPath.substring(0, loaderPath
.lastIndexOf("/"))
+ "/";
loaderPath = loaderPath.replace(packPath, "");
String tPath = loaderPath + filePath;
logger.info("file the path =" + tPath);
in = new FileInputStream(tPath);
}
return in;
}

4、读取图片的方法
jar中时使用相对路径读取,路径不能以/开头,且不能用getResource,方法如下

//imgPath在jar中是空字符串,非jar中是/
public static ImageIcon createImageIcon(String path) {
String tmp = path;
if(tmp != null && tmp.startsWith("/"))
{
path = path.substring(1);
}
try
{
String imgPath = Constants.getImgPath();
if("".equals(imgPath))
{//在jar中
return new ImageIcon(path);
}
else
{
return new ImageIcon(ImageIcon.class.getResource(imgPath + path));
}
}
catch(Exception e)
{
LogUtils.Log(logger, e);
return null;
}
}


5、保存文件时,使用绝对路径,绝对路径获取方式

private static String RealClzPath=null; //classes目录的物理路径
private static Logger logger = Logger.getLogger(Constants.class);
private static String imgPath = null; //图片路径前置,如果项目打包成JAR,前置为空,如果项目没打包,这前置为"/"
static
{
String currentJarPath = null;
try
{
currentJarPath = URLDecoder.decode(Constants.class.getProtectionDomain().getCodeSource().getLocation().getFile(), "UTF-8");
}
catch (UnsupportedEncodingException e)
{
LogUtils.Log(logger, e);
}
String path = Constants.class.getResource("").getPath();
int pos = path.indexOf("!");
if(pos != -1)
{//在jar中
logger.info("class is in jar");
RealClzPath = path.substring(0,pos);
pos = RealClzPath.lastIndexOf("/");
imgPath = "";
if(pos != -1)
{
RealClzPath = path.substring(0,pos+1);
}
}
else
{
//String loaderPath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
imgPath = "/";
String loaderPath = currentJarPath;
String packPath = Constants.class.getPackage().toString();
packPath = packPath.replace("package ", "");
packPath = "/" + packPath.replace(".", "/");
loaderPath = loaderPath.replace(packPath, "");
RealClzPath = loaderPath;
}
logger.info("RealClzPath = " + RealClzPath + " imgPath=" + imgPath);

}
展开阅读全文

eclipse 打包 .jar 后图片无法加载

08-03

先说一下我的目录结构吧.rnE:\学习\Javarn这个文件夹是用来放 eclipse 工程的.rn我要打包的工程名为 Calculatorrn它当然也是在 E:\学习\Java 下的一个子目录rnrnE:\学习\Java\Calculator 下有三个文件夹和二个文件rnrnE:\学习\Java\Calculator\bin 是存放 .class的rn但是我建立了包 包名 calculator .rn所以 E:\学习\Java\Calculator\bin 里只有一个子文件夹 E:\学习\Java\Calculator\bin\calculatorrn所有里面的4个.classrn它们就是在 E:\学习\Java\Calculator\bin\calculator 下rnrnE:\学习\Java\Calculator\images 是存放图片的.这些图片可以在 eclipse 下正确加载和运行rn(正确运行指的是:JButton jb = new JButton(new ImageIcon("images/about.gif"));)rnrnE:\学习\Java\Calculator\src\calculator 这个下面就是 .java 文件了.rnrnE:\学习\Java\Calculator 下剩下的二个文件分别是 .classpath 和 .projectrnrnrn但是我打包后发现图片无法加载...rnrnpublic class Resourcernrn public static URL getImgResource(String name)rn rn return Resource.class.getResource(name);rn rnrnrn这个是取得图片类.rnrnJButton jb = new JButton(new ImageIcon(Resource.getImgResource("images/about.gif")));rn这是加载语句.rnrn这句在 eclipse 下运行都会出现空指针异常.rnrn我觉得有两个问题.rn1.图片放置的物理路径问题.它该那在哪里合适呢?rn2.获取图片语句的路径问题."images/about.gif"正确么?rnrn第一次打包带图的,还不太明白,请各位帮帮忙.谢谢了! 论坛

没有更多推荐了,返回首页