Java_java命令行编译运行
Posted 杨迈1949
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java_java命令行编译运行相关的知识,希望对你有一定的参考价值。
现在写java或者安卓项目都是使用IDE完成,但是有些简单的工作,使用IDE太浪费了,比如打包一个类的jar,如果使用命令行,也非常简单;所以复习一下,便于以后翻阅;
1.创建文件Hello.java
Hello.java目录为:D:/com/raise/base/Hello.java
内容:
package com.raise.base;//指定包名
//需要导包的在这里导入
public class Hello
public static void main(String [] args)
System.out.println("Hello World!");
2.编译生成.class
在windows命令行下编译Hello.java
生成Hello.class
:
javac D:\\com\\raise\\base\\Hello.java -encoding utf8
Hello.class路径:D:\\com\\raise\\base\\Hello.class
3.运行执行Hello
D:\\>java com/raise/base/Hello
Hello World!
注意这里需要在D:\\目录下运行,指定class文件时,不需要.class
后缀,需要指定包名
4.查看Hello的java签名信息
java类的签名信息在jni开发中有重要作用。
使用javap -s查看
D:\\>javap -s com/raise/base/Hello
Compiled from "Hello.java"
public class com.raise.base.Hello
public com.raise.base.Hello();
Signature: ()V
public static void main(java.lang.String[]);
Signature: ([Ljava/lang/String;)V
5.打包jar
将.class
文件打包jar,便于项目之间使用,注意.java文件不需要打包,所以需先删除;
使用jar -cvf hello.jar com
D:\\>jar -cvf hello.jar com
已添加清单
正在添加: com/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: com/raise/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: com/raise/base/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: com/raise/base/Hello.class(输入 = 431) (输出 = 297)(压缩了 31%)
将会在D:\\目录下生成hello.jar
;
查看jar包中的内容jar -vtf hello.jar
:
D:\\>jar -vtf hello.jar
0 Fri Jun 02 18:00:24 CST 2017 com/
0 Fri Jun 02 18:00:42 CST 2017 com/raise/
0 Fri Jun 02 18:56:46 CST 2017 com/raise/base/
431 Fri Jun 02 18:46:16 CST 2017 com/raise/base/Hello.class
0 Fri Jun 02 19:29:04 CST 2017 META-INF/
100 Fri Jun 02 19:30:30 CST 2017 META-INF/MANIFEST.MF
注意该jar中多了一个清单文件MANIFEST.MF
,这是java标准清单文件,后面会有用;
6.执行jar文件
使用java -jar hello.jar
执行jar
D:\\>java -jar hello.jar
hello.jar中没有主清单属性
但是报错,提示没有清单文件,其实第5步已经查看了jar中是有这个文件的,所以这里有坑,那我们百度一下,百度之后得知清单文件中并没有配置main函数所在的java类,那我们增加即可;
1. 首先解压jar
2. 然后修改MANIFEST.MF,增加一行Main-Class: com.raise.base.Hello
3. 再打包成jar
解压jar:
D:\\>jar -xf hello.jar
修改后的MANIFEST.MF文件:
Manifest-Version: 1.0
Created-By: 1.7.0_67 (Oracle Corporation)
Main-Class: com.raise.base.Hello
打包jar:
D:\\>jar -cvfM hello.jar com META-INF
正在添加: com/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: com/raise/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: com/raise/base/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: com/raise/base/Hello.class(输入 = 431) (输出 = 297)(压缩了 31%)
正在添加: META-INF/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: META-INF/MANIFEST.MF(输入 = 100) (输出 = 97)(压缩了 3%)
注意这里要增加参数M,指定默认的清单文件不要打包,因为我们已经有了。
再运行:
D:\\>java -jar hello.jar
Hello World!
ok,搞定!
搞一个这么简单的Hello World!都这么麻烦,现在知道IDE是有多好了吧!
最后附上jar命令的使用帮助,其实就是jar -help
结果!
D:>jar -help
非法选项: h
用法: jar ctxui[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] files …
选项包括:
-c 创建新的归档文件
-t 列出归档目录
-x 从档案中提取指定的 (或所有) 文件
-u 更新现有的归档文件
-v 在标准输出中生成详细输出
-f 指定归档文件名
-m 包含指定清单文件中的清单信息
-e 为捆绑到可执行 jar 文件的独立应用程序
指定应用程序入口点
-0 仅存储; 不使用情况任何 ZIP 压缩
-M 不创建条目的清单文件
-i 为指定的 jar 文件生成索引信息
-C 更改为指定的目录并包含其中的文件
如果有任何目录文件, 则对其进行递归处理。
清单文件名, 归档文件名和入口点名称的指定顺序
与 ‘m’, ‘f’ 和 ‘e’ 标记的指定顺序相同。示例 1: 将两个类文件归档到一个名为 classes.jar 的归档文件中:
jar cvf classes.jar Foo.class Bar.class
示例 2: 使用现有的清单文件 ‘mymanifest’ 并
将 foo/ 目录中的所有文件归档到 ‘classes.jar’ 中:
jar cvfm classes.jar mymanifest -C foo/ .
参考链接:
命令行执行java程序
以上是关于Java_java命令行编译运行的主要内容,如果未能解决你的问题,请参考以下文章