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

简介:

一 问题由来

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

wKiom1aLbvLQhC4eAAAVhpYSRkA317.png

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

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

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

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

wKiom1aLby7hqUPdAABAzNiL0Uc895.png

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

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

wKioL1aLb4Kxt_oaAAEEpSLIQBI941.png

wKiom1aLb13BJ1TrAACr7MeOdgw752.png

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

二 问题引申

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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包中文件的读取,但是仍然是有一定弊端性的,那就是没法在程序执行的过程中动态地修改该配置文件中的值。



本文转自 pangfc 51CTO博客,原文链接:http://blog.51cto.com/983836259/1731724,如需转载请自行联系原作者

相关文章
|
25天前
|
IDE Java Linux
Seata常见问题之重新打包以单独用jar来部署如何解决
Seata 是一个开源的分布式事务解决方案,旨在提供高效且简单的事务协调机制,以解决微服务架构下跨服务调用(分布式场景)的一致性问题。以下是Seata常见问题的一个合集
101 1
|
2月前
|
Java Maven
流水线之项目打包找不到rt.jar
自己打包的时候在maven中这样配置就可以<bootclasspath>${java.home}\lib\rt.jar;${java.home}\lib\jce.jar</bootclasspath>。但是在云效中不是自己的服务器,这样配置不可以,如何找到jdk的具体位置呢?
102 0
|
4月前
|
Java 关系型数据库 Linux
Linux|Java|jar包的解压和重新打包(更新配置)
Linux|Java|jar包的解压和重新打包(更新配置)
67 0
|
3月前
|
SQL Java 流计算
Flink SQL UDF(用户自定义函数)需要打包成JAR文件并上传到Flink集群中
【1月更文挑战第1天】【1月更文挑战第2篇】Flink SQL UDF(用户自定义函数)需要打包成JAR文件并上传到Flink集群中
83 0
|
18天前
|
Java Linux
Linux运行jar并选择配置文件
Linux运行jar并选择配置文件
8 1
|
1月前
|
NoSQL Java 应用服务中间件
使用innoSetup将mysql+nginx+redis+jar包打包成windows安装包
使用innoSetup将mysql+nginx+redis+jar包打包成windows安装包
使用innoSetup将mysql+nginx+redis+jar包打包成windows安装包
|
4月前
|
Java Maven
maven管理工具使用package打包的时候无法将lib文件夹下的第三方jar包打入,上线打jar包后运行异常问题
maven管理工具使用package打包的时候无法将lib文件夹下的第三方jar包打入,上线打jar包后运行异常问题
|
1月前
|
Java 开发工具 Windows
Windows环境下面启动jar包,输出的日志出现乱码的解决办法
Windows环境下面启动jar包,输出的日志出现乱码的解决办法
|
1月前
|
网络协议 Java Nacos
Nacos报错问题之jar 包启动就报错误如何解决
Nacos是一个开源的、易于部署的动态服务发现、配置管理和服务管理平台,旨在帮助微服务架构下的应用进行快速配置更新和服务治理;在实际运用中,用户可能会遇到各种报错,本合集将常见的Nacos报错问题进行归纳和解答,以便使用者能够快速定位和解决这些问题。
|
1月前
|
Java Shell Docker
Docker启动后怎样运行jar包文件
Docker启动后怎样运行jar包文件