Java 编译打包命令
背景
我们有的时候总是要使用将自己写的工程编译成 class 文件,同时打包成 jar,虽然有各种工具可以帮助我们,但是毕竟掌握使用 java 本来的命令去做这些更灵活
编译
比如我要编译包名为 com.demo,全称为 com.demo.Main 的这个类,同时将生成的文件指定到当前目录下的 bin 文件夹下,那么在么做呢?
Main.java 内容:
1 package com.demo; 2 public class Main{ 3 4 public static void main(String[] argvs){ 5 System.out.println("-------****Hello world!***-------"); 6 } 7 8 }
由于编译的类是有包名的,所以必须在工作目录下创建包名对应的文件夹,将源码放在对应文件夹下,如果不这么做会找不到这个类,然后执行 javac 命令
1 mkdir bin #创建输出目录 2 javac com/demo/Main.java -d bin #会在 bin 文件夹下生成 com/demo/Main.class 文件
打包
打包 bin 文件夹下所有资源到 jar 包
1 touch bin/property.pro 2 jar -cvfm main.jar mymanifest -C bin .#这里 mymanifest 对应 m 选项,会将 mymanifset 合并到 jar 中的 META-INF/MANIFEST.MF,也就是跟新清单配置文件了,-C 后面指定要打包的目录 (编译的时候没有这么方便) 注意目录后面的 . 代表所有文件 3 #最终会在当前工作目录下生成一个 main.jar 包文件,里面包括 bin 下的所有文件
更新 jar 包内容
1 mkdir res 2 touch res/map.property 3 jar -uvf main.jar res/map.property #此时如果解压 jar 包,会发现生成了 res 目录,同时目录下有 map.property 文件,当然如果文件之前已经存在, 那么这个文件会被更新 4 #jar -uvfm main.jar manifest 如果要跟新清单文件要用 m 选项
解压
jar -xvf main.jar #会在当前目录下解压 main.jar 包,注意不能指定解压路径
运行
1 java -jar main.jar #java -classpath main.jar com.demo.Main 2 #输出 3 -------****Hello world!***-------
参考
1 javac 2 3 用法: javac <options> <source files> 4 其中, 可能的选项包括: 5 -g 生成所有调试信息 6 -g:none 不生成任何调试信息 7 -g:{lines,vars,source} 只生成某些调试信息 8 -nowarn 不生成任何警告 9 -verbose 输出有关编译器正在执行的操作的消息 10 -deprecation 输出使用已过时的 API 的源位置 11 -classpath <路径> 指定查找用户类文件和注释处理程序的位置 12 -cp <路径> 指定查找用户类文件和注释处理程序的位置 13 -sourcepath <路径> 指定查找输入源文件的位置 14 -bootclasspath <路径> 覆盖引导类文件的位置 15 -extdirs <目录> 覆盖所安装扩展的位置 16 -endorseddirs <目录> 覆盖签名的标准路径的位置 17 -proc:{none,only} 控制是否执行注释处理和/或编译。 18 -processor <class1>[,<class2>,<class3>...] 要运行的注释处理程序的名称; 绕过默认的搜索进程 19 -processorpath <路径> 指定查找注释处理程序的位置 20 -parameters 生成元数据以用于方法参数的反射 21 -d <目录> 指定放置生成的类文件的位置 22 -s <目录> 指定放置生成的源文件的位置 23 -h <目录> 指定放置生成的本机标头文件的位置 24 -implicit:{none,class} 指定是否为隐式引用文件生成类文件 25 -encoding <编码> 指定源文件使用的字符编码 26 -source <发行版> 提供与指定发行版的源兼容性 27 -target <发行版> 生成特定 VM 版本的类文件 28 -profile <配置文件> 请确保使用的 API 在指定的配置文件中可用 29 -version 版本信息 30 -help 输出标准选项的提要 31 -A关键字[=值] 传递给注释处理程序的选项 32 -X 输出非标准选项的提要 33 -J<标记> 直接将 <标记> 传递给运行时系统 34 -Werror 出现警告时终止编译 35 @<文件名> 从文件读取选项和文件名
1 jar 2 3 用法: jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ... 4 选项: 5 -c 创建新档案 6 -t 列出档案目录 7 -x 从档案中提取指定的 (或所有) 文件 8 -u 更新现有档案 9 -v 在标准输出中生成详细输出 10 -f 指定档案文件名 11 -m 包含指定清单文件中的清单信息 12 -n 创建新档案后执行 Pack200 规范化 13 -e 为捆绑到可执行 jar 文件的独立应用程序 14 指定应用程序入口点 15 -0 仅存储; 不使用任何 ZIP 压缩 16 -P 保留文件名中的前导 '/' (绝对路径) 和 ".." (父目录) 组件 17 -M 不创建条目的清单文件 18 -i 为指定的 jar 文件生成索引信息 19 -C 更改为指定的目录并包含以下文件 20 如果任何文件为目录, 则对其进行递归处理。 21 清单文件名, 档案文件名和入口点名称的指定顺序 22 与 'm', 'f' 和 'e' 标记的指定顺序相同。 23 24 示例 1: 将两个类文件归档到一个名为 classes.jar 的档案中: 25 jar cvf classes.jar Foo.class Bar.class 26 示例 2: 使用现有的清单文件 'mymanifest' 并 27 将 foo/ 目录中的所有文件归档到 'classes.jar' 中: 28 jar cvfm classes.jar mymanifest -C foo/ .
1 java 2 3 用法: java [-options] class [args...] 4 (执行类) 5 或 java [-options] -jar jarfile [args...] 6 (执行 jar 文件) 7 其中选项包括: 8 -d32 使用 32 位数据模型 (如果可用) 9 -d64 使用 64 位数据模型 (如果可用) 10 -server 选择 "server" VM 11 默认 VM 是 server, 12 因为您是在服务器类计算机上运行。 13 14 15 -cp <目录和 zip/jar 文件的类搜索路径> 16 -classpath <目录和 zip/jar 文件的类搜索路径> 17 用 : 分隔的目录, JAR 档案 18 和 ZIP 档案列表, 用于搜索类文件。 19 -D<名称>=<值> 20 设置系统属性 21 -verbose:[class|gc|jni] 22 启用详细输出 23 -version 输出产品版本并退出 24 -version:<值> 25 警告: 此功能已过时, 将在 26 未来发行版中删除。 27 需要指定的版本才能运行 28 -showversion 输出产品版本并继续 29 -jre-restrict-search | -no-jre-restrict-search 30 警告: 此功能已过时, 将在 31 未来发行版中删除。 32 在版本搜索中包括/排除用户专用 JRE 33 -? -help 输出此帮助消息 34 -X 输出非标准选项的帮助 35 -ea[:<packagename>...|:<classname>] 36 -enableassertions[:<packagename>...|:<classname>] 37 按指定的粒度启用断言 38 -da[:<packagename>...|:<classname>] 39 -disableassertions[:<packagename>...|:<classname>] 40 禁用具有指定粒度的断言 41 -esa | -enablesystemassertions 42 启用系统断言 43 -dsa | -disablesystemassertions 44 禁用系统断言 45 -agentlib:<libname>[=<选项>] 46 加载本机代理库 <libname>, 例如 -agentlib:hprof 47 另请参阅 -agentlib:jdwp=help 和 -agentlib:hprof=help 48 -agentpath:<pathname>[=<选项>] 49 按完整路径名加载本机代理库 50 -javaagent:<jarpath>[=<选项>] 51 加载 Java 编程语言代理, 请参阅 java.lang.instrument 52 -splash:<imagepath> 53 使用指定的图像显示启动屏幕 54 有关详细信息, 请参阅 http://www.oracle.com/technetwork/java/javase/documentation/index.html。