我们经常将web工程打成war包部署到tomcat上,对于普通的java工程(Java Project)要打成普通的jar包或者是可运行的jar包该怎么做呢

打包之前先确定以下几点是否要打成可运行的jar包

项目是否依赖了第三方的jar包

是否需要读取jar包外的配置文件

普通的JAR包(不可运行,也不依赖其他JAR包)

JAR FILE的方式通常是将项目打成一个普通的jar包(非运行jar包)



选择要打包的文件,不需要的文件不必打包,减小打包后的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 把一些重构的信息文件也包含进去

然后一路Next,最后Finish就好了。

可运行并且依赖其他JAR包

方式一(JAR file)

在工程目下新建文件MANIFEST.MF,并添加以下参数

Manifest-Version: 1.0
Class-Path: tf.jar/lib/junit.jar tf.jar/lib/log4j.jar tf.jar/lib/ojdbc6_g.jar tf.jar/lib/org.hamcrest.core_1.3.0.v201303031735.jar
Main-Class: priv.bss.gj.SeqMatchTblColApplication

第一行是MAINIFEST的版本

第二行Class-Path就指定了外来jar包的位置

第三行指定我们要执行的MAIN java(main方法)文件

需要注意以下几点:Class-Path: 和Main-Class: 后边都有一个空格,必须加上,否则会打包失败,错误提示为:Invalid header field

假设我们的项目打包后为SumECNU4.0.jar,那么按照上面的定义,应该在 SumECNU4.0.jar的同层目录下建立一个lib文件夹(即lib文件和打包的jar文件在同一个目录下),并将相关的jar包放在里面。否则将会出现“Exception in thread “main” java.lang.NoClassDefFoundError”的错误

Main-Class后面是类的全地址,比如你的主文件是SMTester.java,文件里打包为package edu.ecnu.dase.test; 那么这里就写edu.ecnu.dase.test.SMTester,不要加.java后缀,主文件地址写错将会出现“找不到或无法加载主类”的错误

写完Main-Class后一定要回车(即最后一行是空白行),让光标到下一行,这样你生成的jar包才能找到你的主class去运行,否则将会出现“jar中没有主清单属性”的错误

右击Java工程选择Export—>选择JAR file—>Next



选择自己的MANIFEST.MF文件,然后Finish


最后的项目结构


lib目录里面是依赖的jar包,需要自己创建lib目录并且把jar放进去(与打包好的jar包同一级目录)

方式二(Runnable JAR file)

右击Java工程选择Export—>选择Runnable JAR file—>Next


library handling选项说明第一个为提取extract需要的依赖的库或jar合成到jar 文件里

第二个则仅仅打包依赖库到jar文件

第三个则把依赖库放到一个文件夹中

最后的项目结构

依赖的第三方的jar包已经包含在了打包好的jar包里面了


读取JAR包外部的配置文件

我们的工程常常需要读取配置文件,如果配置文件存放在根目录(src)下,打jar包的时候会将配置文件一起打包。这时候我们想要修改配置文件的信息,还要用压缩工具打开jar包再进行修改,这实在有点麻烦,所以通常需要读取jar包外部的配置文件

修改读取配置文件的代码

首先我们要修改读取配置文件的代码

代码例子如下(以读取数据库配置为例)

private static Properties properties;
/**
* 抽取数据库配置文件
*/
static {
try {
properties = new Properties();
//读取程序内部(根目录下)的配置文件
//InputStream resourceAsStream = DBUtil.class.getClassLoader().getResourceAsStream("db.properties");
/**
* 读取程序外部配置文件(jar包外的文件)
* System.getProperty("user.dir") 获取项目的绝对路径
*/
String property = System.getProperty("user.dir")+"/db.properties";
//logger.debug(property);
InputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(property));
properties.load(bufferedInputStream);
} catch (IOException e) {
logger.error("读取配置文件出错!",e);
}
}

打jar包

然后用方式一(JAR file)或者方式二(Runnable JAR file)将工程打成jar包

然后将配置文件放在jar包同一级目录下

最后的项目结构

方式一(JAR file)


方式二(Runnable JAR file)


参考文章