javamaven打包jar配置文件时选择哪些配置文件打入

java项目开发中,最终生成的jar,大概可分为二类,一类是一些通用的工具类(不包含main入口方法),另一类是可直接运行的jar包(有main入口方法),下面主要讲的是后者,要让一个jar文件可直接运行,通常有几下三种方式:
动工之前,先搭一个项目架子便于后面分析:
项目结构图:&
这是一个gradle项目(当然,也可以换成ant项目或maven项目,这不重要),里面有二个模块,my-jar的DemoApp里提供了main入口方法,通常一个可运行的java项目,都会依赖其它一些jar包,所以另一个模块my-lib模拟工具类的jar包,即:简单来说,my-jar依赖my-lib。
my-lib中DemoLib类的源代码:
1 package yjmyzz.runnable.
3 public class DemoLib {
public static void demo() {
System.out.println("我是DemoLib中的demo方法");
my-jar中DemoApp类的源代码:
1 package yjmyzz.runnable.
3 import yjmyzz.runnable.lib.DemoL
5 public class DemoApp {
public static void main(String[] args) {
DemoLib.demo();
二个项目编译后,会得到二个jar包:my-jar.jar及my-lib.jar
方法一:不借助manifest文件
java -classpath jar1:jar2:jar3... &mainClassName
解解一下:
红色的是固定部分,中间蓝色的是jar包的路径(多个jar之间用:号连接),最后绿色的部分是main方法所在的类名,按这个思路
把这二个jar包扔同一个目录下,输入如下命令:
java -classpath my-jar.jar:my-lib.jar yjmyzz.runnable.jar.DemoApp
程序就能跑起来了
方法二:借助manifest文件
想办法在my-jar.jar中添加MANIFEST.MF文件,内容参考下面这样:
Main-Class: yjmyzz.runnable.jar.DemoAppClass-Path: my-lib.jar
同样,将这二个jar包扔在一起,然后
java -jar my-jar.jar 就能运行了,至于如何在打包里,自动添加MANIFEST.MF文件,gradle下可以这么做:
manifest {
attributes 'Main-Class': 'yjmyzz.runnable.jar.DemoApp'
attributes 'Class-Path': 'my-lib.jar'
&build.gradle中添加这一段即可,如果是maven项目,请参考& &一文
方法三:借助spring-boot 插件
前面二种方法,主程序的jar包,与依赖的jar包是分开的,这在云环境中,上传部署比较麻烦,得传多个文件(或者上传前,先压缩成一个包,再传到服务器上解压),服务器节点多时,操作起来太累。又到我大Spring出场了,将my-jar项目中的build.gradle改成下面这样:
apply plugin: 'java'
apply plugin: 'spring-boot'
buildscript {
repositories {
url 'http://maven.oschina.net/content/groups/public/'
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.0.RELEASE")
repositories {
url 'http://maven.oschina.net/content/groups/public/'
dependencies {
compile project(':my-lib')
然后命令行输入 gradle bootRepackage 将在build/libs下生成二个文件my-jar.jar以及my-jar.jar.original(先不用管这个original文件是啥)
直接java -jar my-jar.jar 就能运行了(注意:这种方式下,并不需要my-lib.jar这类依赖的jar文件),其原理在于spring-boot插件把所有依赖的jar包,全都打到一个jar包里了。
基本上,到这里这篇文章就可以完结了,如果有同学对spring-boot这种打包方式比较好奇,想深入研究,可以继续向下看,把my-jar.jar.original改名为my-jar-origin.jar,然后输入jar tf my-jar-origin.jar 即显示这个jar包的内容,会得到以下输出:
META-INF/MANIFEST.MF
yjmyzz/runnable/
yjmyzz/runnable/jar/
yjmyzz/runnable/jar/DemoApp.class
即.original文件,其实就是一个普通的jar包,其中的MANIFEST.MF并没有什么实质性内容,只是一个空壳,这样的jar包,跟方法1得到的jar包是一样的。
再输入jar tf my-jar.jar,会得到以下输出:
1 META-INF/
2 META-INF/MANIFEST.MF
4 yjmyzz/runnable/
5 yjmyzz/runnable/jar/
6 yjmyzz/runnable/jar/DemoApp.class
8 lib/my-lib.jar
10 org/springframework/
11 org/springframework/boot/
12 org/springframework/boot/loader/
13 org/springframework/boot/loader/LaunchedURLClassLoader$Java7LockProvider.class
14 org/springframework/boot/loader/PropertiesLauncher$ArchiveEntryFilter.class
15 org/springframework/boot/loader/PropertiesLauncher$PrefixMatchingArchiveFilter.class
16 org/springframework/boot/loader/ExecutableArchiveLauncher$1.class
17 org/springframework/boot/loader/PropertiesLauncher.class
18 org/springframework/boot/loader/LaunchedURLClassLoader$ResourceEnumeration.class
19 org/springframework/boot/loader/data/
20 org/springframework/boot/loader/data/ByteArrayRandomAccessData.class
21 org/springframework/boot/loader/data/RandomAccessDataFile$DataInputStream.class
22 org/springframework/boot/loader/data/RandomAccessData.class
23 org/springframework/boot/loader/data/RandomAccessDataFile$FilePool.class
24 org/springframework/boot/loader/data/RandomAccessDataFile.class
25 org/springframework/boot/loader/data/RandomAccessData$ResourceAccess.class
26 org/springframework/boot/loader/util/
27 org/springframework/boot/loader/util/SystemPropertyUtils.class
28 org/springframework/boot/loader/util/AsciiBytes.class
29 org/springframework/boot/loader/LaunchedURLClassLoader$1.class
30 org/springframework/boot/loader/InputArgumentsJavaAgentDetector.class
31 org/springframework/boot/loader/Launcher.class
32 org/springframework/boot/loader/LaunchedURLClassLoader.class
33 org/springframework/boot/loader/JarLauncher.class
34 org/springframework/boot/loader/jar/
35 org/springframework/boot/loader/jar/JarEntryFilter.class
36 org/springframework/boot/loader/jar/JarURLConnection.class
37 org/springframework/boot/loader/jar/JarEntry.class
38 org/springframework/boot/loader/jar/Bytes.class
39 org/springframework/boot/loader/jar/CentralDirectoryEndRecord.class
40 org/springframework/boot/loader/jar/JarFile$2.class
41 org/springframework/boot/loader/jar/ZipInflaterInputStream.class
42 org/springframework/boot/loader/jar/JarFile.class
43 org/springframework/boot/loader/jar/JarFile$1.class
44 org/springframework/boot/loader/jar/JarURLConnection$1.class
45 org/springframework/boot/loader/jar/Handler.class
46 org/springframework/boot/loader/jar/JarURLConnection$JarEntryName.class
47 org/springframework/boot/loader/jar/JarEntryData.class
48 org/springframework/boot/loader/MainMethodRunner.class
49 org/springframework/boot/loader/InputArgumentsJavaAgentDetector$1.class
50 org/springframework/boot/loader/WarLauncher.class
51 org/springframework/boot/loader/PropertiesLauncher$1.class
52 org/springframework/boot/loader/ExecutableArchiveLauncher.class
53 org/springframework/boot/loader/LaunchedURLClassLoader$LockProvider.class
54 org/springframework/boot/loader/archive/
55 org/springframework/boot/loader/archive/JarFileArchive$JarFileEntry.class
56 org/springframework/boot/loader/archive/JarFileArchive.class
57 org/springframework/boot/loader/archive/FilteredArchive.class
58 org/springframework/boot/loader/archive/JarFileArchive$1.class
59 org/springframework/boot/loader/archive/ExplodedArchive.class
60 org/springframework/boot/loader/archive/FilteredArchive$2.class
61 org/springframework/boot/loader/archive/Archive$Entry.class
62 org/springframework/boot/loader/archive/ExplodedArchive$1.class
63 org/springframework/boot/loader/archive/Archive$EntryFilter.class
64 org/springframework/boot/loader/archive/FilteredArchive$1.class
65 org/springframework/boot/loader/archive/ExplodedArchive$FileEntry.class
66 org/springframework/boot/loader/archive/Archive.class
67 org/springframework/boot/loader/archive/Archive$EntryRenameFilter.class
68 org/springframework/boot/loader/archive/ExplodedArchive$FilteredURLStreamHandler.class
69 org/springframework/boot/loader/archive/ExplodedArchive$FileNotFoundURLConnection.class
70 org/springframework/boot/loader/JavaAgentDetector.class
很明显,多出了很多内容,注意第8行,可以发现my-lib.jar这个依赖的jar包,已经打包到my-jar.jar内部了,这时的MANIFEST.MF内容为:
1 Manifest-Version: 1.0
2 Start-Class: yjmyzz.runnable.jar.DemoApp
3 Spring-Boot-Version: 1.3.0.RELEASE
4 Main-Class: org.springframework.boot.loader.JarLauncher
Main-Class被设置成org.springframework.boot.loader.JarLauncher,此外还增加了Start-Class指向我们真正的程序入口yjmyzz.runnable.jar.DemoApp,换句话说,程序运行时,先调用org.springframework.boot.loader.JarLauncher,然后找到Start-Class对应的类,最终运行,运行过程中,会查找内部lib下的依赖jar包my-lib.jar,当然这一切是需要有额外的代码来处理的,所以多出来的org/springframework/boot下的一堆class,就是spring用来干这件事儿的。
第三种方式,很适合云环境的部署,只需要扔一个jar包上去就完事了,这种all-in-one的jar包,也被换为fat-jar。
参考文章:
阅读(...) 评论()打jar包时将log4j配置文件放在jar包外的方法
- 小强博客 - ITeye博客
博客分类:
在eclipse中默认将log4j的配置文件放在src文件夹下,程序可以直接读取到配置文件,并以配置文件的配置输入日志。
但是在将程序发布是,默认log4j的配置文件也要一同被打入jar包才可能被读取到,要想将log4j的配置文件放在jar包外可以通过以下的代码手动指定log4j配置文件的位置,
将以下代码放在main函数所在类中:
DOMConfigurator.configure(System.getProperty("user.dir") + File.separator + "conf" + File.separator
+ "log4j.xml");
DOMConfigurator.configure(System.getProperty("user.dir") + File.separator + "conf" + File.separator
+ "log4j.xml");
PropertyConfigurator.configure(System.getProperty("user.dir") + File.separator + "conf" + File.separator
+ "log4j.properties");
PropertyConfigurator.configure(System.getProperty("user.dir") + File.separator + "conf" + File.separator
+ "log4j.properties");
上述代码是log4j的配置文件放在jar包所在目录下的conf目录中。
以上代码的区别在于DOMConfigurator载入的是log4j.xml而PropertyConfigurator载入的是log4j.properties文件。
System.getProperty("user.dir")得到的是程序所在的目录
浏览: 675560 次
来自: 北京
太好了,谢谢啊。
学习了,谢谢您~
算法有问题,会产生不可见字符,造成信息丢失
该图片仅限百度用户内部交流关于系统读取properties配置文件的路径问题,包括打成jar包的运行文件
我的图书馆
关于系统读取properties配置文件的路径问题,包括打成jar包的运行文件
在当前的一个项目中,遇到以下业务需要:
1.开发环境是在myeclipse里运行的时候,启动服务后,有一个加载配置文件属性信息的Global.java。用于得到配置文件里的配置信息;
2.发布系统的时候,需要把系统打成jar执行,这时候之前的加载配置文件的方法就不起作用了得不到配置文件的路径;
3.因在系统刚启动时,需要启动加载一个Listener,在Listener里又加载了一个配置文件。
4.以上加载配置文件,都是只能加载一次配置文件,当配置文件的内容修改后,只能再次重启服务后才能读取到变动的配置内容,系统中有些配置参数是需要时时获取配置文件里的最新参数信息。
如何在以上场景加载配置文件呢,通过来回的找资料、调试,终于搞定。以下是具体代码:
[java] package&&&&&import&java.io.FileInputS&&import&java.io.IOE&&import&java.io.InputS&&import&java.util.P&&&&import&mons.configuration.PropertiesC&&import&mons.configuration.reloading.FileChangedReloadingS&&public&class&Test&{&&&&&&public&static&void&main(String[]&args)&throws&Exception{&&&&&&&&&&System.out.println(load1());//通过ClassLoader方式加载配置文件&&&&&&&&&&System.out.println(load2());//&&&&&&&&&&&&&&&&}&&&&&&/**&&&&&&*&通过ClassLoader方式加载配置文件&&&&&&*&这种加载方式:&&&&&&*&&&&&&&&&&1.可在myeclipse里运行时得到配置文件路径;&&&&&&*&&&&&&&&&&2.亦可在把项目打成jar包运行时,得到配置文件路径;&&&&&&*/&&&&&&public&static&String&load1()throws&Exception{&&&&&&&&&&Properties&p&=&new&Properties();&&&&&&&&&&InputStream&in&=&Test.class.getClassLoader().getResourceAsStream("config/config.properties");&&&&&&&&&&p.load(in);&&&&&&&&&&return&&p.getProperty("user_name").toString().trim();&&&&&&&}&&&&&&&&&&&&/**&&&&&&*&自动加载配置文件机制,可在修改配置文件后,不用重启服务也能得到配置文件的新内容&&&&&&*/&&&&&&public&static&String&load2()throws&Exception{&&&&&&&&&&String&file_name&=&Test.class.getClassLoader().getResource("config/config.properties").getFile();&&&&&&&&&&Properties&p&=&new&Properties();&&&&&&&&&&PropertiesConfiguration&propconfig&=//创建自动加载的机制&&&&&&&&&&propconfig&=&new&PropertiesConfiguration();&&&&&&&&&&propconfig.setEncoding("UTF-8");//设置编码&&&&&&&&&&propconfig.setReloadingStrategy(new&FileChangedReloadingStrategy());//设置自动冲加载机制&&&&&&&&&&p.load(new&FileInputStream(file_name));&&&&&&&&&&return&p.getProperty("user_name").toString().trim();//每次调用这个方法都会从配置文件里取到最新的参数&&&&&&}&&}&&
TA的最新馆藏
喜欢该文的人也喜欢1514人阅读
java基础(1)
步骤1:准备主清单文件 “MANIFEST.MF”,
由于是打包引用了第三方jar包的项目,故需要自定义配置文件MANIFEST.MF,在该项目下建立文件MANIFEST.MF,内容如下:
Manifest-Version: 1.0
Class-Path: lib/commons-codec.jar lib/commons-httpclient-3.1.jar lib/commons-logging-1.1.jar lib/log4j-1.2.16.jar lib/jackson-all-1.8.5.jar
Main-Class: main.KillCheatFans
第一行是MAINIFEST的版本,第二行Class-Path就指定了外来jar包的位置,第三行指定我们要执行的MAIN java文件。这里要注意几点:1、Class-Path: 和Main-Class: 后边都有一个空格,必须加上,否则会打包失败,错误提示为:Invalid header field;
2、假设我们的项目打包后为KillCheatFans.jar,那么按照上面的定义,应该在 KillCheatFans.jar的同层目录下建立一个lib文件夹(即lib文件和打包的jar文件在同一个目录下),并将相关的jar包放在里面。否则将会出现“Exception in thread &main& java.lang.NoClassDefFoundError”的错误;
3、Main-Class后面是类的全地址,比如你的主文件是KillCheatFans.java,文件里打包为package com. 那么这里就写com.main.KillCheatFans,//切记这一点&&&&&&不要加.java后缀,主文件地址写错将会出现“找不到或无法加载主类”的错误;
4、写完Main-Class后一定要回车(即最后一行是空白行),让光标到下一行,这样你生成的jar包才能找到你的主class去运行,否则将会出现“jar中没有主清单属性”的错误。步骤2:右击Java工程选择Export—&选择JAR file—&Next&步骤3:选择要打包的文件,不需要的文件不必打包,减小打包后的jar文件大小,并进行选项配置如下
这里有几个选项:* Export generated class files and resources 表示只导出生成的.class文件和其他资源文件
* Export all output folders for checked projects 表示导出选中项目的所有文件夹
* Export java source file and resouces 表示导出的jar包中将包含你的源代码*.java,如果你不想泄漏源代码,那么就不要选这项了
* Export refactorings for checked projects 把一些重构的信息文件也包含进去&步骤4:选择我们在第一步中自定义的配置文件路径,这一步很重要,不能采用默认选项&这里解释一下配置项:* Generate the manifest file:是系统帮我们自动生成MANIFEST.MF文件,如果你的项目没有引用其他class-path,那可以选择这一项。
* Use existing mainfest from workspace:这是可以选择我们自定义的.MF文件,格式如上所写,引用了第三方包时选用。
* Seal content:要封装整个jar或者指定的包packet。
* Main class:这里可以选择你的程序入口,将来打包出来的jar就是你这个入口类的执行结果。&最后Finish,即生成了我们要的jar文件。&运行该jar文件有两种方式:1. 在命令行下运行命令java -jar 你的jar文件名称,比如我的执行如下:如果在jar中有一些System.out.prinln语句(如上执行结果),运行后不想在控制台输出而是保存在文件中方便以后查看,可以用一下命令:java -jar KillCheatFans.jar & log.txt (这时命令行窗口不会有任何输出)输出信息会被打印到log.txt中,当然log.txt自动生成,并位于和KillCheatFans.jar一个目录中。&2. 新建一个批处理文件,如start.bat,内容为:java -jar KillCheatFans.jar,放在jar文件同一目录下即可,以后点击自动运行即可,更加方便。&方案二:安装Eclipse打包插件Fat Jar&&&& 方案一对于含有较多第三方jar文件或含有第三方图片资源等就显得不合适,太繁琐。这时可以使用一个打包的插件—Fat Jar。&&&& Fat Jar Eclipse Plug-In是一个可以将Eclipse Java Project的所有资源打包进一个可执行jar文件的小工具,可以方便的完成各种打包任务,我们经常会来打jar包,但是eclipse自带的打包jar似乎不太够用,Fat Jar是eclipse的一个插件,特别是Fat Jar可以打成可执行Jar包,并且在图片等其他资源、引用外包方面使用起来更方便。安装方法:1. Eclipse在线更新方法Help & Install New Software & Add,name:Fat Jarlocation:http://kurucz-grafika.de/fatjar2. Eclipse插件手动安装方法下载地址:http://downloads.sourceforge.net/fjep/net.sf.fjep.fatjar_0.0.27.zip?modtime=&big_mirror=0将解压出的plugins中的文件复制到eclipse安装目录中的plugins目录下,然后重启eclipse即可。使用方法:步骤1:右击工程项目选择Buile Fat Jar&步骤2:配置jar文件存放目录,主Main文件等,如下图&步骤3:选择所要用到的第三方jar包&最后Finish,即生成了我们要的jar文件,十分方便。&
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:4298次
排名:千里之外
(1)(3)(1)(1)(2)4392人阅读
java编程语言(20)
在阅读的过程中有任何问题,欢迎一起交流
一、程序设置
Java的main方法有个初始化入参args,将参数表示为配置文件的路径,代码如下:
<span style="color:# public static void main(String[] args) {
<span style="color:#
loadConf(args[0]);
<span style="color:# }
1 public static void loadConf(String path) throws Exception {
Properties props = new Properties();
InputStream in = new FileInputStream(path);
props.load(in);
fromDB = props.getProperty(&fromDB&);
fromDBUser = props.getProperty(&fromDBUser&);
fromDBPassword = props.getProperty(&fromDBPassword&);
if (StringUtils.isEmpty(fromDB)) {
String errmsg = &fromDB or tables is null&;
<span style="color:#
logger.error(errmsg);
<span style="color:#
throw new Exception(errmsg);
<span style="color:#
<span style="color:# }
二、打包程序
通过eclipse的export,将程序打包成jar(打包过程中不勾选配置文件选项)
三、运行jar包
在linux下执行jar包引入外部配置文件的命令(window下比如进入d: 同样的道理,java -jar XXX.jar config.properties):
java -jar db2Util-uberjar.jar /opt/pasier/config.properties
其中的args就可以用来加载上面红色部分的配置文件路径。
参考链接:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:74085次
积分:1384
积分:1384
排名:千里之外
原创:66篇
转载:11篇
评论:15条
(1)(3)(6)(4)(6)(10)(15)(3)(16)(1)(12)

我要回帖

更多关于 jar 打包配置文件 的文章

 

随机推荐