手动编译java找不到包,手动打个jar包

之前使用Eclipse直接打了可运行的jar包,最近因为想用jenkins自动打包运行,所以需要把code从Git上down下来以后,用shell打包运行。

本来以为挺简单的事情,经历种种问题,跟执行目录和manifest文件纠结了两天后,终于理出了思路。

Step 1: 代码结构及编译

----ProjectName

----src

----com

-----company

-----product

-------component

-----

1.java

------2.java

------3.java

-------******

----lib

-----a.jar

------b.jar

------*****

最基本的主要就是这两个了,一个是源码(带package信息),一个是lib(第三方库)

首先 cd 进入当前的ProjectName 目录下,在该目录下编译源码:

javac -d class -encoding utf-8 -cp

"lib/jxl.jar;lib/atlassian-util-concurrent-2.4.1.jar;lib/jira-rest-java-client-2.0.0-m2.jar;lib/backport-util-concurrent-3.1.jar;lib/joda-time-2.1.jar;lib/guava-14.0-rc3.jar"

src/com/company/product/component/*

这里 -d 用来指定编译后文件存放位置

-encoding 指定编码,没有这个会报错

-cp 或 -classpath

用来指定寻找第三方文件的路径,没有或不对的话,会报找不到或打不开主类

这个需要注意:1. 引入的jar包不支持通配符,需要一个一个具体引入,之间用分号隔开【shell

用冒号隔开】

最后是指定需要编译的java文件,路径要具体到包名下最后一级,否则找不到。

Step 2:打jar包

编译完成后,目录应该是这个样子了

----ProjectName

----src

----com

-----company

-----product

-------component

-----

1.java

------2.java

------3.java

-------******

----class

----com

-----company

-----product

-------component

-----

1.class

------2.class

------3.class

-------******

----lib

-----a.jar

------b.jar

------*****

-----MANIFEST.MF

(稍后详解这个)

接下来将编译后的文件打成jar包:

首先要先进入class目录下,因为打jar包会以package路径生成文件夹结构,这个路径错一点都执行报错,两天也主要在折腾classpath和这个。

首先: cd class

执行: ..../class>: jar -cvfm

../myjarname.jar ../MANIFEST.MF

class/*

----这里参数m用来指定MANIFEST文件

----把生成的jar包放在了上级目录

Step3:执行jar

配好java path的情况下,现在可以回到项目目录执行jar包了:

cd ..

../ProjectName:> java -jar

myjarname.jar

接下来说一说这两天最最纠结头疼的事情MANIFEST.MF文件。

首先,先回顾一下要点:

1. javac 编译时,classpath 一定要对,一定要对,一定要对

2. javac 编译时,一定要指定java文件的目录到包底下,就是你能看到java文件的那一层,然后用 *

表示编译所有文件。因为文件与文件之间有依赖调用关系,部分编译可能会报错。

然后说说这个MANIFEST.MF文件,打的jar包能不能乖乖运行全靠它了。

首先贴下我的成版(删减部分):

Manifest-Version: 1.0

Created-By: 1.8.0_45 (Oracle Corporation)

Class-Path: lib/activation-1.1.jar

lib/analytics-api-2.17.jar

...

...

lib/spring-tx-3.2.1.RELEASE.jar

Main-Class: com.tools.dailywork.Report

重点就是Class-Path 和

Main-Class了,当然,如果上面打jar包的时候严格按照目录规范了的,这个mainclass就比较容易了,

写上包含包路径的类名就好

至于Class-Path,也是以执行路径为基准,到所写的目录下去找,一样的注意事项:

1. jar包有几个列举几个不能正则匹配

2.

格式很重要,因为MANIFEST一行的字符数有限制,多的话必须换行,每个jar包之间用空格隔开,换行的话,每行行头两个空格,行尾留一个空格。整个文件末尾记得留两行什么都没有(包括空格)的空行。

把这个文件打入jar包中。

整理完看起来很简单,但是中间的路径关系很微妙,错一点就很头疼~ 终于守得云开见月明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值