聊聊、Java 命令 第一篇
网上很多讲 Javac 和 Java 命令的,我觉得还是要自己写一写,做一个自己的总结,也方便以后查询。
开始之前先看看 help 命令,基本上任何一个软件都会提供这个命令。
没有什么比 -help 好用,Java -help 你可以看到你想要的信息。

(一)Java 运行 class 无依赖
上面的命令我们平时用的最多的,也就 -cp 和 -classpath,-version,-d。先来看看我的目录结构吧。D:\exe\consumer\Consumer.java。

暂时只需要关注 Consumer.java,很简单的一个类。没有任何的依赖,只是输出 i am consumer。

我们来编译一下

没问题,生成了 class 文件,不过是直接生成在当前目录。我们来运行下。直接运行 java Consumer 肯定是不行的。试试看。

根本没法找到,原因是啥呢?看看上面 Consumer 类就知道了,有包路径 package com.rockcode.www.rabbitmq。这就涉及到了 Java 类加载,Java 应用类加载器会去 Classpath 下面去找这个包中的类。
但是现在的目录是 D:\exe\consumer,所以不可能找到。Java 执行命令必须指定包和类名,而且包下面必须有这个类存在。也就是我们需要创建 com.rockcode.www.rabbitmq 包,
在下面存放 Consumer.class 文件就行了。
我们用 D:\exe\consumer>javac Consumer.java -d . 编译一下,可以看到生成了 com.rockcode.www.rabbitmq 包

在执行 java com.rockcode.www.rabbitmq.Consumer。

这样就行了。Javac 是编译命令,没依赖情况下任何目录都行。Java 是执行命令,加载机制决定了必须指定包+类名。如果说类与类之间的区分是用包那也不对,同样的包下面同样的类,不同的类加载器加载的类是不一样的。
所以 Java 里面要区分两个类是否相同,首先类加载器一样,然后看是否在同一个路径。这里我想到了一道面试题,说我们自己建一个类 String,路径是 java.lang.String 包下面,问这个类是否可以被加载到。
网上很多答案是可以啊,用不同的加载器就行了。但是 Java 的双亲委派机制限制了。你是加载不到这个类的,除非你破坏双亲委派机制。
(二)Java 运行 Jar 无依赖
我们将 Consumer.class 打包成 jar,再来运行下。运行 jar -cvf Consumer.jar Consumer.class 命令生成 Consumer.jar 文件
通过上面命令生成的 Consumer.jar 结构如下

然后执行 java -jar Consumer.jar 。

OK,没有主清单属性。Consumer.jar 中没有主清单属性,看看 META-INF\MANIFEST.MF 文件,没有指定 Main-Class。加上 Main-Class: Consumer,注意一定要空格。

再来执行上面的命令 java -jar Consumer.jar 。

无法加载主类 Consumer,what? 原因还是在 Consumer.java 类指定了包名 com.rockcode.www.rabbitmq,那么将 Main-Class: Consumer 换成 Main-Class: com.rockcode.www.rabbitmq.Consumer 可以吗?
也不行,因为上面 Consumer.jar 的结构中没有 com.rockcode.www.rabbitmq 包的存在。正确的结构如下:

我来用正确的命令打 jar 包,首先在 D:\exe\consumer 目录下面建 manifest.mf 文件。内容如下

然后用 jar -cvfm Consumer.jar manifest.mf com\rockcode\www\rabbitmq\Consumer.class 命令打 jar 包。

OK,再来运行下 java -jar Consumer.jar。

到这里手动编译和打包就完成了。
如果你是用 maven 打包,则在 pom 中加入 maven-jar-plugin 插件,如下

谢谢大家观看,这一篇都是没有依赖的类,下一篇来看看有依赖的类是怎么编译和执行的。
聊聊、Java 命令 第一篇的更多相关文章
- 从.Net到Java学习第一篇——开篇
以前我常说,公司用什么技术我就学什么.可是对于java,我曾经一度以为“学java是不可能的,这辈子不可能学java的.”结果,一遇到公司转java,我就不得不跑路了,于是乎,回头一看N家公司交过社保 ...
- 聊聊、Java 命令 第二篇
第一篇类之间没有依赖关系,所以比较简单,这一篇来看看有依赖的类怎么编译和执行. (一)Java 运行 class 有依赖 Person 是一个接口,只有一个 getName 方法.Man 则实现了 P ...
- 学习java随笔第一篇:搭建java平台(java se)
电脑系统:windows8 在这里介绍一下java平台的3个版本: Java SE--Java Standard Edition,Java的标准版,主要用于桌面级的应用和数据库开发. Java EE- ...
- 【JAVA并发第一篇】Java的进程与线程
1.进程与线程 1.1.进程 进程可以看作是程序的执行过程.一个程序的运行需要CPU时间.内存空间.文件以及I/O等资源.操作系统就是以进程为单位来分配这些资源的,所以说进程是分配资源的基本单位. ( ...
- Java 学习 第一篇
1:Java文档注释:使用javadoc工具可以提取程序中文档注释来生成API文档:javadoc命令的基本用法:javadoc 选项 java源文件/包javadoc -d {} -windowti ...
- Java安全第一篇 | 反射看这一篇就够了
什么是反射? Java安全可以从反序列化漏洞说起,反序列化漏洞又可以从反射说起.反射是⼤多数语⾔⾥都必不可少的组成部分,对象可以通过反射获取他的类,类可以通过反射拿到所有⽅法(包括私有),拿到的⽅法可 ...
- [转载] Java高新技术第一篇:类加载器详解
本文转载自: http://blog.csdn.net/jiangwei0910410003/article/details/17733153 首先来了解一下字节码和class文件的区别: 我们知道, ...
- Java高新技术第一篇:类加载器详解
首先来了解一下字节码和class文件的区别: 我们知道,新建一个Java对象的时候,JVM要将这个对象对应的字节码加载到内存中,这个字节码的原始信息存放在classpath(就是我们新建Java工程的 ...
- Java【第一篇】基本语法之--关键字、标识符、变量
关键字 定义:被Java语言赋予了特殊含义,用做专门用途的字符串(单词)特点:关键字中所有字母都为小写 标识符 Java 对各种变量.方法和类等要素命名时使用的字符序列称为标识符凡是自己可以起名字的地 ...
随机推荐
- HDU 2476 String painter 刷字符串(区间DP)
题意: 给出两个串s1和s2,每次可以将s1中的一个整个区间刷成同个字母,问最少刷几次才能让s1变成s2? 思路: 假设最坏情况,两串没任何一个位置是相同的,那么全都得刷,相当于将一个空白串刷成s2. ...
- IE Proxy Swich - IE 代理切换工具
通过此工具可方便的切换计算机系统代理设置的开关,无需重启IE 来激活设置 下载 环境要求: 可能需要.NET 4.0 以上平台, 其他平台未测试 截图与功能如下 支持快捷方式参数 我个人习惯是在桌面 ...
- linux 命令——44 top (转)
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.下面详细介绍它的使用方法.top是 一个动态显示过程,即可以通过用户按键来不断刷 ...
- 关于ffmpeg(libav)解码视频最后丢帧的问题
其实最初不是为了解决这个问题而来的,是Peter兄给我的提示解决另一个问题却让我误打误撞解决了另外一个问题之后也把这个隐藏了很久的bug找到(之前总是有一些特别短的视频产生不知所措还以为是视频素材本身 ...
- 【HDU4507】恨7不成妻(数位DP)
点此看题面 大致题意: 让你求出一段区间内与\(7\)无关的数的平方和.与\(7\)无关的数指整数中任意一位不为\(7\).整数的每一位加起来的和不是\(7\)的整数倍.这个整数不是\(7\)的倍数. ...
- iOS 真机报错 Command CodeSign failed with a nonzero exit code
今天在网上下载的一个小demo,在模拟器上正常运行,但是在真机上报错: 解决方式: 1.打开钥匙串:2.锁住login keychain: 3.再把它解锁. 然后就能真机上正常运行了,
- 使用Scanner类获取键盘输入的会员卡号,并将该数据存储在变量中,输出这个变量的信息
package come.one01;import java.util.Scanner; // 导入Scanner类public class One03 { public static void ma ...
- java设计模式——建造者模式
一. 定义与类型 定义:将一个复杂对象的构建与它的表示分离,使用同样的构建过程可以创建不同的表示 用户只需制定需要建造的类型就可以得到它们,建造过程以及细节不需要知道 类型:创建型 建造者模式与工厂模 ...
- 操作DOM -------JavaScrip
本文摘要:http://www.liaoxuefeng.com/ 经常用到. 由于HTML文档被浏览器解析后就是一棵DOM树,要改变HTML的结构,就需要通过JavaScript来操作DOM. 始终记 ...
- PAT 乙级 1044
题目 题目地址:PAT 乙级 1044 思路 简单的进制转化问题,根据题意进行相应的进制转化即可,因为题目已经划定了数据的求解范围,甚至连进制转化中的循环都不需要,进行简单计算就可以得出结果: 但本题 ...