在某些时候, 可能拿到其他人的一个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打包, 写的都很好,一看激动!