使用idea将java程序和依赖包打包为一个可运行的jar程序
有时候用java编写一些工具程序,打包成一个单独jar包,只要有java环境就可以运行。
而且有可能会有修改源码放到一个陌生环境去编译的需求,这时候就需要将项目源码和依赖的lib库文件放一起,只要有jdk和idea就可以修改源码、编译打包,而不用搭建maven环境(有时候环境可能没有联网)。
下面是一个用来打包的示例工程:
配置步骤
-
创建一个library指向包含依赖外部jar的目录:
-
创建一个artifacts:
-
选择main函数所在类
-
构建jar包
点击【Build】->【Build Artifacts】->【Build】,打包成功。
-
执行测试
PS C:\work\dev\javahello\out\artifacts> java -jar .\javahello_jar\javahello.jar Hello World! SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. Windows PS C:\work\dev\javahello\out\artifacts>
如果直接在idea里面点【运行】可以执行成功,但是打包的jar包执行时报库中的类没有找到:
PS C:\work\dev\javahello\out\artifacts\javahello_jar> java -jar .\javahello.jar Hello World! Exception in thread "main" java.lang.NoClassDefFoundError: oshi/SystemInfo at Main.main(Main.java:7) Caused by: java.lang.ClassNotFoundException: oshi.SystemInfo at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) ... 1 more
那可能是因为在创建Artifacts之后,再把jar包放到lib目录中的。如果是这样只需要把原来创建的Artifacts删了重新创建一个,重新创建的时候会提示
MANIFEST.MF
文件已经存在,把MANIFEST.MF
删除后重新创建Artifacts就行。也就是说【创建Artifacts】这一步要在加lib库文件之后做。