有关打包成可执行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,如需转载请自行联系原作者

相关文章
|
Java Maven
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
在Java项目中,启动jar包时遇到“no main manifest attribute”错误,且打包大小明显偏小。常见原因包括:1) Maven配置中跳过主程序打包;2) 缺少Manifest文件或Main-Class属性。解决方案如下:
3065 8
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
|
前端开发 JavaScript Java
Java打包jar运行时分离lib和jar
在`pom.xml`的`build`节点中,设置`packaging`为`jar`,并配置插件分离依赖库到`lib`目录和资源文件到`resources`目录。这样可以在运行时通过`-Dloader.path=lib,resources`加载外部依赖和资源文件,便于独立升级依赖库和修改资源文件,而无需重新打包程序。具体插件包括`maven-dependency-plugin`、`maven-resources-plugin`和`spring-boot-maven-plugin`等。
824 2
|
Java 应用服务中间件 Maven
Maven的三种项目打包方式——pom,jar,war的区别
Maven 提供了多种打包方式,分别适用于不同类型的项目。pom 用于父项目或聚合项目,便于项目的结构和依赖管理;jar 用于Java类库或可执行的Java应用程序;war 则专用于Java Web应用程序的部署。理解这些打包方式的用途和特点,可以帮助开发者更好地配置和管理Maven项目,确保构建和部署过程的顺利进行。无论是单模块项目还是多模块项目,选择合适的打包方式对于项目的成功至关重要。
2366 3
|
Java Maven 容器
Maven使用IDEA自带工具打包,同时将lib下的jar包打入,双击jar包可直接运行
使用IntelliJ IDEA的Artifacts功能,可以将项目依赖的第三方jar包打包进jar文件中,实现双击jar包即可直接运行。
Maven使用IDEA自带工具打包,同时将lib下的jar包打入,双击jar包可直接运行
|
Java Windows
如何在windows上运行jar包/JAR文件 如何在cmd上运行 jar包 保姆级教程 超详细
本文提供了一个详细的教程,解释了如何在Windows操作系统的命令提示符(cmd)中运行JAR文件。
9338 1
|
Java Maven C++
【Azure Developer】记录一次使用Java Azure Key Vault Secret示例代码生成的Jar包,单独运行出现 no main manifest attribute, in target/demo-1.0-SNAPSHOT.jar 错误消息
【Azure Developer】记录一次使用Java Azure Key Vault Secret示例代码生成的Jar包,单独运行出现 no main manifest attribute, in target/demo-1.0-SNAPSHOT.jar 错误消息
340 0
|
Java
[JarEditor]可直接修改jar包的IDEA插件
### 修改JAR包变得更简单:JarEditor插件简介 **背景:** 开发中常需修改JAR包中的class文件,传统方法耗时费力。JarEditor插件让你一键编辑JAR包内文件,无需解压。 **插件使用:** 1. **安装:** 在IDEA插件市场搜索JarEditor并安装。 2. **修改class:** 打开JAR文件中的class,直接编辑,保存后一键构建更新JAR。 3. **文件管理:** 右键菜单支持在JAR内新增/删除/重命名文件等操作。 4. **搜索:** 使用内置搜索功能快速定位JAR包内的字符串。
2285 2
[JarEditor]可直接修改jar包的IDEA插件
|
弹性计算 Java Serverless
Serverless 应用引擎操作报错合集之上传自定义JAR包,启动时报错,是什么导致的
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
关系型数据库 Java 分布式数据库
PolarDB产品使用问题之部署到服务器上的Java应用(以jar包形式运行)无法连接,如何解决
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。

热门文章

最新文章