在可执行jar包中调用配置文件

问题:

当把用Spring框架开发的java project(在Eclipse中可以正常执行)导出为可执行jar包时,单独执行jar包会出现无法找到applicationContext.xml文件的问题;

原因:

applicationContext.xml文件是被打包到jar包内部的,而jar包独立运行时,该程序只能识别jar外部的文件,无法识别内部文件。


解决方案:

在启动初始化期间,将jar包内部的文件拷贝到jar包外部相对路径中。

代码如下:

	//jarFullFileName: the file name with full path in jar.
	//newFilePath: the new file directory. "./" means the current directory of jar file.
	public boolean newFileFromJar(String jarFullFileName, String newFilePath){
		String[] jarFilePath = null;
		String newFileName = null;
		File file = null;
		OutputStream os = null;
		InputStream is = null;
		
		try {
			//check if the source file existed.
			is = Configer.class.getResourceAsStream(jarFullFileName);
			if(is == null){
				System.out.println("Fail to get input stream.");
				return false;
			}
			//get the new file's full path name
			jarFilePath = jarFullFileName.split("/");
			newFileName = newFilePath+jarFilePath[jarFilePath.length-1];
			System.out.println(newFileName);
			
			//open or create the new file
			file = new File(newFileName);
			if(file.exists()){
				System.out.println("file existed.");
			}
			else {
				if(file.createNewFile() == false) {
					System.out.println("fail to create new file "+newFileName);
					return false;
				}
					
			}
			os = new FileOutputStream(file);
			
			//copy file content
			byte[] buff = new byte[1024];
			while (true) {
				int readed = is.read(buff);
				if (readed == -1) {
					break;
				}
				byte[] temp = new byte[readed];
				System.arraycopy(buff, 0, temp, 0, readed);
				os.write(temp);
			}
		}
		catch(Exception e) {
			e.printStackTrace();
			return false;
		}
		//close the io streams
		try {
			if(os != null)
				os.close();
			if(os != null)
				os.close();
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		return true;
	}
	...
	//注意:参数jarFullFileName是jar包内部的相对路径,如路径"/applicationContext.xml"表示jar包根目录下的文件
	newFileFromJar("applicationContext.xml",".");//copy the file to the current directory of jar file


注意:

在使用独立jar文件运行的java代码中,没法使用ClassPathXmlApplicationContext(..)来加载Spring的配置文件,因为该方法只能用于读取WEB-INF\classes下的配置文件。此时需要使用FileSystemXmlApplicationContext(..)方法来加载配置文件。

Spring Boot是一个非常流行的Java框架,它可以轻松地将Java应用部署为独立的、自包含的可执行jar文件,包含了应用所有所需的依赖库。但是,有时候我们需要从可执行jar文件读取一些配置文件或者资源文件,这些文件在构建过程被打包进了jar包文件。那么该怎么读取这些文件呢? Spring Boot提供了一个非常简单的方式,只需要使用Spring框架的Resource类就可以轻松地实现。在Spring Boot使用Resource类来读取jar包的文件,如下所示: ```java import org.springframework.core.io.Resource; import org.springframework.core.io.ClassPathResource; public class ReadFileFromJar { public static void main(String[] args) throws IOException { Resource resource = new ClassPathResource("config.properties"); InputStream inputStream = resource.getInputStream(); Properties properties = new Properties(); properties.load(inputStream); String value = properties.getProperty("key"); System.out.println(value); } } ``` 上面的代码,我们首先使用ClassPathResource类创建一个Resource对象,然后调用getInputStream()方法获取文件的输入流。最后,我们使用Properties类读取属性文件的内容,并输出其的一个属性值。 注意:在使用Spring Boot的时候,所有的资源文件都需要放到classpath路径下,这样Resource类才能正确读取。在IDE集成开发环境,可以将这些文件放到src/main/resources目录下,或者配置maven的build过程将这些资源文件打包到jar文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值