网上很多讲 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 插件,如下

谢谢大家观看,这一篇都是没有依赖的类,下一篇来看看有依赖的类是怎么编译和执行的。

最新文章

  1. Lucene.net站内搜索—2、Lucene.Net简介和分词
  2. 高效 Java Web 开发框架 JessMA v3.2.3 正式发布
  3. <input type="file" />浏览时只显示指定文件类型
  4. Unable to boot device in current state: Creating
  5. RecyclerView更通用——listView的onItemClick,onLongItemClick,addHeaderView,addFooterView
  6. DICOM:C-GET与C-MOVE对照剖析
  7. Serialization performance analysis
  8. Mysql高级之游标
  9. 我的Emacs折腾经验谈(一) 一些给新人的建议
  10. [转]intent 传递对象
  11. LDA 线性判别分析
  12. 精通 JS正则表达式(转)
  13. JDK10安装配置详解
  14. 批量IP自动ping脚本
  15. css-选择器性能
  16. scrapy爬虫的编写步骤
  17. 【Android】amr文件时长
  18. Android6.0执行时权限解析,RxPermissions的使用,自己封装一套权限框架
  19. CLH队列锁
  20. cocos2dx游戏--欢欢英雄传说--添加血条

热门文章

  1. 实战:ADFS3.0单点登录系列-ADFS3.0安装配置
  2. PHP的模板引擎smarty原理浅谈
  3. pta 编程题13 File Transfer
  4. iframe高度随内容自适应的方法
  5. IOS NSBundle使用(访问文件夹)
  6. selenium跳过https的问题
  7. UVA 11600 Masud Rana(概率dp)
  8. 前端知识体系之CSS及其预处理器SASS/LESS
  9. 2019年5~6月训练记录(更新ing)
  10. python_输出100:200内的素数