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命令行编译运行的主要内容,如果未能解决你的问题,请参考以下文章

Java_JAVA6动态编译的问题

Java_Java SE6调用动态编译

Java 的命令行 编译和运行参数 如:-cp 怎么理解?

使用命令行编译和运行 cJava和python程序

java命令行编译和运行引用jar包的文件

windows下用命令行编译并运行java工程,怎样编译引用的多个jar包和配置文件.xml呢?