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

举个栗子:

项目结构如下:

Java选择指定jar引入类 java jar 指定主类_Java

含有文件: 

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)

Java选择指定jar引入类 java jar 指定主类_jdk_02

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

Java选择指定jar引入类 java jar 指定主类_Java选择指定jar引入类_03

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

Java选择指定jar引入类 java jar 指定主类_jdk_04

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

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

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

Java选择指定jar引入类 java jar 指定主类_jdk_05

可以看到生成的class文件.

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

 

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

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

jar -cvf MainClass.jar com/

Java选择指定jar引入类 java jar 指定主类_Java选择指定jar引入类_06

此时执行 java -jar MainClass.jar

Java选择指定jar引入类 java jar 指定主类_Java选择指定jar引入类_07

提示没有主清单属性, 其实就是在 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

Java选择指定jar引入类 java jar 指定主类_Java选择指定jar引入类_08

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

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

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

Java选择指定jar引入类 java jar 指定主类_jdk_09

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

 

Java选择指定jar引入类 java jar 指定主类_Java_10

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

直接执行MainClass1.jar 

Java选择指定jar引入类 java jar 指定主类_Javac_11

啦啦, 成功了!

对命令 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打包, 写的都很好,一看激动!