使用Jdk自带的jar.exe打包指定主类的可执行jar

在某些时候, 可能拿到其他人的一个Java源程序, 但是电脑暂时没有安装开发工具(eclipse, idea 等), 但是想将引用跑起来, 这时候就需要我们通过使用jdk自带的命令将java文件编译成class文件

举个栗子:

项目结构如下:

含有文件: 

com/xxx/MainClass.java

com/xxx/service/HelloService.java

com/xxx/service/impl/HelloServiceImpl.java

 

代码如下:

com/xxx/MainClass.java


package com.xxx;

import com.xxx.service.HelloService;
import com.xxx.service.impl.HelloServiceImpl;

public class MainClass {

    public static void main(String[] args) {
        HelloService helloService = new HelloServiceImpl();
        helloService.hello();
    }

}


com/xxx/service/HelloService.java


package com.xxx.service;

public interface HelloService {
    void hello();
}
 


com/xxx/service/impl/HelloServiceImpl.java


package com.xxx.service.impl;

import com.xxx.service.HelloService;

public class HelloServiceImpl implements HelloService {
    @Override
    public void hello() {
        System.out.println("Hello world , This project is to try to manual packaging jar !");
    }
}


 

此时需要将java文件进行编译成class文件: (当前项目路径为 D:/test)

在当前目录下进入cmd窗口:(在地址栏输入cmd, 然后回车)

在cmd窗口执行命令: javac -d out com/xxx/*.java com/xxx/service/*.java com/xxx/service/impl/*.java

参数 -d 指定的时输出目录, 使用的时相对路径, 但是当前目录下没有该文件所以报错

新建out文件夹, 再次执行上面的命令

执行完毕后进入到out文件夹:

可以看到生成的class文件.

PS: 针对大型项目, 使用上述命令的话, 因为所有路径都要写全, 实属不智! 所以聪明的你可以写一个小工具遍历项目,获取路径作为参数 (下次补上小工具类).

 

现在在D:/test/out下已经有我们要的class文件, 此时要做的就是打包生成可执行文件

此时,我们进入到D:/test/out目录下, 并进入cmd窗口, 执行如下命令

jar -cvf MainClass.jar com/

此时执行 java -jar MainClass.jar

提示没有主清单属性, 其实就是在 MainClass.jar 包中META-INF文件夹内MANIFEST.MF中缺少内容. 当前内容如下:


Manifest-Version: 1.0
Created-By: 1.8.0_172 (Oracle Corporation)


此时我们只需要在后面添加以下内容 (com.xxx.MainClass 为启动类, 含有main方法)


Main-class: com.xxx.MainClass


注意: ":" 和 com 之间有空格

此时再次执行 java -jar MainClass.jar

执行成功! 啦啦♪(^∇^*)

但是作为一个程序员的我们,肯定不会满足于通过修改文件的方式这么low的方式来做的,所以我们可以简单的通过增加一个参数来达成目的:

先把刚才的MainClass.jar文件删除:

在打开cmd窗口执行 jar -cvfe MainClass1.jar com.xxx.MainClass com/

 

为了区分,将生成的文件修改成了MainClass1.jar

直接执行MainClass1.jar 

啦啦, 成功了!

对命令 jar -cvfe MainClass1.jar com.xxx.MainClass com/ 做一个小小的解释:

-c  打包

-v 输出详细信息(可有可无)

-f 指定文件名字

-e 指定入口类

MainClass1.jar 打包生成的文件名

com.xxx.MainClass 就是要写入到MANIFEST.MF文件中的 Main-class: 后面的类名

com/ 被打包的目录

 

当然, 这种情况是很少遇到的 ! 作为一个Java程序员, 电脑里没有个IDEA, 没有个eclipse, 没有个Maven 怎么可能? 所以最简单的方式还是通过工具来生成, 还不容易出错! 网上有很多博客写关于使用Maven打包, 写的都很好,一看激动! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值