近况(问题描述)
最近我负责某项目,需要完成一项任务是打出jar包,通过window server服务器自带的任务计划程序(系统的定时任务创建程序),定时去某平台下载相关的数据,在打jar包的环节,我就遇到了一些奇怪的问题,在这里跟大家做一下分享,希望有遇到这类问题的小伙伴可以通过这篇文章得到些启发,希望可以帮到你。
打包方案
未引入外部jar包
未引用外部jar包的打包稍微简单点
1.手动编写MANIFEST.MF
项目中的MANIFEST.MF,一定要手动创建放在src/META-INF目录下,并且文件中的Main-Class:和Class-Path:后面一定要有一个空格;最后面的Class-Path:lib/commons-codec-1.6.jar lib/commons-logging-1.1.3.jar lib/dom4j-2.0.0.jar lib/fastjson-1.2.56.jar lib/gson-2.8.0.jar lib/httpclient-4.3.3.jar lib/httpcore-4.3.2.jar lib/music-sdk-java.jar lib/protobuf-java-3.0.0-beta-4.jar写完后,要点一下回车,保证最后面还有一个空行,经过验证,如果不加空行,最后的Class-Path会被吞掉!
2.右键项目,选择Export导出-->选择Java-JAR file
3.左侧的项目选择src以及一些你项目中必须的文件,都勾选上就行。Select the export destination中选择的Jar file,一定要和MANIFEST.MF中的Main-Class中指向的主启动类一直,比如主启动类是cma.music.demo.clib.StaElemSearchAPI.StaElemSearchAPI,那么这个地方的命名就是cma.music.demo.clib.StaElemSearchAPI.StaElemSearchAPI.j
4.点击next,进入到JAR Packaging Options页面,什么也不要勾选,直接next
5.进入到JAR Manifest Specification页面,一定要勾选Use existing manifest from workspace,其中的Manifest file选择我们项目中手动创建的MANIFEST.MF路径
6.点击finish即可!
引入外部jar包或配置文件
1.手动编写MANIFEST.MF
项目中的MANIFEST.MF,一定要手动创建放在src/META-INF目录下,并且文件中的Main-Class:和Class-Path:后面一定要有一个空格;最后面的Class-Path:lib/commons-codec-1.6.jar lib/commons-logging-1.1.3.jar lib/dom4j-2.0.0.jar lib/fastjson-1.2.56.jar lib/gson-2.8.0.jar lib/httpclient-4.3.3.jar lib/httpcore-4.3.2.jar lib/music-sdk-java.jar lib/protobuf-java-3.0.0-beta-4.jar写完后,要点一下回车,保证最后面还有一个空行,经过验证,如果不加空行,最后的Class-Path会被吞掉!
给大家附一下我的MANIFEST.MF文件内容,格式直接粘贴应该就可以吧
Manifest-Version: 1.0
Main-Class: cma.music.demo.clib.StaElemSearchAPI.StaElemSearchAPI
_CLIB_callAPI_to_serializedStr_JSON
Class-Path: lib/commons-codec-1.6.jar lib/commons-logging-1.1.3.jar lib/dom4j-2.0.0.jar lib/fastjson-1.2.56.jar lib/gson-2.8.0.jar lib/httpclient-4.3.3.jar lib/httpcore-4.3.2.jar lib/music-sdk-java.jar lib/protobuf-java-3.0.0-beta-4.jar
2.右键项目,选择Export导出-->选择Java-JAR file
3.左侧的项目选择这里和上面为引入jar包的区别就是:左侧的项目只选择src,其他的都不要选择,这里需要注意的就是如果引入了外部的jar包,后面单独要在打出的jar包的同级目录下创建一个lib目录,将项目中引用的外部的jar包复制进来
Select the export destination中选择的Jar file,一定要和MANIFEST.MF中的Main-Class中指向的主启动类一直,比如主启动类是cma.music.demo.clib.StaElemSearchAPI.StaElemSearchAPI,那么这个地方的命名就是cma.music.demo.clib.StaElemSearchAPI.StaElemSearchAPI.j
4.点击next,进入到JAR Packaging Options页面,什么也不要勾选,直接next
5.进入到JAR Manifest Specification页面,一定要勾选Use existing manifest from workspace,其中的Manifest file选择我们项目中手动创建的MANIFEST.MF路径
6.点击finish即可!
7.最后找到jar包保存的位置,将项目中引入的外部依赖或其他的文件,都放到jar包存放的同级目录下,比如我遇到的问题是打完jar包,运行jar包报找不到我的配置类,也就是一个client.config客户端配置,里面就是配置了一些连接客户端的信息,我把这个文件也放到同级目录下,就可以正常调用到了。
顺带说一下,打包过程中,肯定会有小伙伴会遇到下面的无主清单属性,这一步主要是在打jar包的第一步很关键!就是那个MANIFEST.MF文件,一定按照上面说的要求编写,不然一定会报这个问题奥
至此,分享结束!这个问题我希望我是最后一个遇到的,加油伙伴们!