有关打包成可执行jar包后引用jar包中配置文件问题

一 问题由来

有时候我们做一些项目时,需要将一些配置信息写入配置文件中,以供调用。比如说这样:

如果我们需要在Demo.java中读取config.txt这个文件中的配置信息,在这种工程目录下是可以使用File来读取的,但是打包成jar后,使用File将不能读取到config.txt了,除非将这个配置信息放在jar包的外面。

假如说我们用File来读取文件:

BufferedReader reader = new BufferedReader(new FileReader(new File("res/config.txt")));

工程状态下是没有问题的,但是打包成jar后执行报错:

很显然是找不到指定的文件,为什么会出现这种问题呢?因为这时候整个jar文件是一个文件了,当然找不到jar包中的配置文件了

我们继续测试,在“测试0.jar”同级目录下新建一个res文件夹,里面放一个config.txt,继续运行:

现在我们可以看到,程序执行的时候没有报错,已经可以正常的运行了

二 问题引申

有人可能想问,如果我非要将配置文件打包进jar中,有没有办法可以访问呢?答案是肯定的。使用 this.getClass().getResourceAsStream(“/config.txt”); 就可以了。完整的获取输入流是这样的:

InputStream inputStream = this.getClass().getResourceAsStream("/config.txt");
			BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));

都得到BufferedReader了,接下来就是正常的读文件了

整个测试小项目的完整源代码如下:

import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Toolkit;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

public class Demo extends JFrame{
	private GridBagLayout gridbag;
	private GridBagConstraints constraints;
	private JPanel mainJPanel;
	private JLabel tip;
	private JScrollPane jScrollPane;
	private JTextArea content;

	private Font contentFont = new Font("宋体", Font.LAYOUT_NO_LIMIT_CONTEXT, 16);  //正文字体

	public Demo(){
		super("引用jar包中配置文件Demo");
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		screenSize = Toolkit.getDefaultToolkit().getScreenSize();  //屏幕大小
		setPreferredSize(new Dimension(700, 300));
		int frameWidth = this.getPreferredSize().width;  //界面宽度
		int frameHeight = this.getPreferredSize().height;  //界面高度
		setSize(frameWidth,frameHeight);
		setLocation((screenSize.width - frameWidth) / 2,(screenSize.height - frameHeight) / 2);

		//初始化
		mainJPanel = new JPanel();
		tip = new JLabel("提示:");
		jScrollPane = new JScrollPane();
		content = new JTextArea(5,10);

		//布局
		gridbag = new GridBagLayout();
		constraints = new GridBagConstraints();
		constraints.fill = GridBagConstraints.BOTH;
		mainJPanel.setLayout(gridbag);

		constraints.gridwidth = 0;  
		constraints.gridheight = 1;
		constraints.weightx = 1;  
		constraints.weighty = 0;  
		gridbag.setConstraints(tip, constraints);
		tip.setFont(contentFont);
		mainJPanel.add(tip);

		constraints.gridwidth = 0;  
		constraints.gridheight = 1;
		constraints.weightx = 1;  
		constraints.weighty = 1;  
		gridbag.setConstraints(jScrollPane, constraints);
		jScrollPane.setFont(contentFont);
		mainJPanel.add(jScrollPane);

		content.setFont(contentFont);
		jScrollPane.setViewportView(content);
		content.setLineWrap(true);
		content.setWrapStyleWord(true);

		try {
			InputStream inputStream = this.getClass().getResourceAsStream("/config.txt");
			BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
			String line = "";
			while((line = reader.readLine()) != null){
				content.append(line + "\n");
			}
			reader.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		add(mainJPanel);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				new Demo();
			}
		});
	}

}

res/config.txt:

test text

注:

这种方式虽然实现了对jar包中文件的读取,但是仍然是有一定弊端性的,那就是没法在程序执行的过程中动态地修改该配置文件中的值。

时间: 2024-10-15 22:05:07

有关打包成可执行jar包后引用jar包中配置文件问题的相关文章

windows环境下把Python代码打包成独立执行的exe可执行文件

有时候因为出差,突然急需处理一批数据.虽然写好的脚本存储在云端随用随取,然而编译的环境还需要重新搭建,模块也需要重新装载,从头到尾这么一遍下来,也是要花费可观的时间成本的. 有没有什么办法,可以让.py文件像可执行文件那样即点即用? py2exe模块 py2exe,顾名思义,就是将.py文件转换成可执行的.exe文件,这样就可以摆脱编译环境和预载模块的限制,在任一windows环境下运行. 一.安装py2exe 通过pip安装模块,下载完毕后自动安装成功,之后就可以放心大胆的使用py2exe了.

将Java程序打包成可执行EXE文件的步骤

需要的工具myeclipse .jar2exe(附上下载地址,直接解压就可以用链接: https://pan.baidu.com/s/1qYPRgXu 密码: wbva) 1.将Java项目导出成.jar包 鼠标右键项目名,选择导出 导出的方式选择Runnable JAR file,点击next继续 选择导出文件的路径: jar文件成功导出到桌面 2.用工具将jar文件打包成EXE可执行文件 选择刚才导出的jar文件 选择要导出程序的类型: 选择主类,图片可不选 导出程序的具体设置: 选择辅助j

(转载)Eclipse将引用了第三方jar包的Java项目打包成可执行jar的两种方法

转载自:http://www.cnblogs.com/lanxuezaipiao/p/3291641.html 方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 "MANIFEST.MF", 由于是打包引用了第三方jar包的Java项目,故需要自定义配置文件MANIFEST.MF,在该项目下建立文件MANIFEST.MF,内容如下: Manifest-Version: 1.0 Class-Path: lib/commons-codec.jar lib/common

将SeqReader打包成可执行的jar包

SeqReader是我定义的一个读取SequenceFile文件,并将部分(key,value)打印到控制台窗口的类,其完整代码如下: 1 /** 2 * Created with IntelliJ IDEA. 3 * User: hadoop 4 * Date: 16-3-14 5 * Time: 上午9:57 6 * To change this template use File | Settings | File Templates. 7 */ 8 import org.apache.h

java打包成可执行的jar或者exe的详细步骤

Java程序完成以后,对于Windows操作系统,习惯总是想双击某个exe文件就可以直接运行程序,现我将一步一步的实现该过程.最终结果是:不用安装JRE环境,不用安装数据库,直接双击一个exe文件,就可以运行程序 下面介绍过程: 第一步:完成Java GUI程序在Eclipse下,程序能够正常运行. 第二步:准备清单文件(MANIFEST.MF) 方法1:直接拷贝其它能运行的JAR文件中的MANIFEST.MF进行修改方法2:利用IDE工具,如Eclipse在生成JAR文件时自动生成MANIFE

Spring Boot 2.0 Intellij Idea 中图文详解打包成可执行Jar

我们使用Spring Boot 2.0 创建好我们的项目后,我们一般需要打包,然后部署到服务器上. 打包步骤: 1. 选中项目,右键--> Open Module Settings. 2. 切换到Artifacts 选项卡下,点击+ 号 3. 点击+ 后,可以看到有很多选项,我们选择Jar, From modules with depedency 4. Main Class 文件浏览或者搜索找到我们的主函数,勾选copy to the out put directory and link via

maven项目打包成可执行的jar

编写功能类:   编写main方法类:   在pom文件中配置:   打包方式: 1.进入到项目所在目录,例如: cd D:\workspace\riskCompensate\FileToZkUtil 2.运行命令 mvn assembly:assembly 3.在项目的target目录中可以看到如下文件 说明打包完成. 运行方式: 1.在cmd命令窗口进入target目录 cd  cd D:\workspace\riskCompensate\FileToZkUtil\target 2.输入 j

java项目打包成可执行jar用log4j将日志写在jar所在目录

开发一个demo时想将日志输出到最终打包的jar所在目录,从网上学习实验整理之后的配置如下, log4j.properties log4j.rootLogger = INFO,console,logFile log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.Threshold=INFO log4j.appender.console.ImmediateFlush=true log4j.app

Eclipse插件开发 RCP生成jar包后获取jar包中的Plugin/Bundle文件资源——以FreeMarker为例

在进行Eclipse插件开发时,有一种应用场景是,需要在插件项目中设置存放有例如配置文件.模板文件的资源文件夹.本文介绍的问题是,插件项目打包发布后,无法访问资源文件夹中的资源文件. 问题重现: 在插件项目的根目录下有模板资源文件夹,需要在插件运行时访问这些资源.在插件开发中,通过"Run as -- Eclipse Application"方式测试插件,可以正常访问,但是生成jar包后发布运行,却无法定位到这些资源文件(表现为,指向该资源文件的URL对象为空). 问题代码(目的是插环