Java 命令行 编译、执行、打包

一般来说 IDE 能够很方便的编译打包。

我写这篇文章是遇到了不能使用 IDE 的情况,简单记录一下,不做深入探讨。

环境

linux
jdk 1.8

简单的编译执行

# 创建演示目录
mkdir -p /usr/local/mytest
# 创建代码目录
mkdir -p /usr/local/mytest/src
# 创建代码包路径
mkdir -p /usr/local/mytest/src/com/demo # 进入演示目录
cd /usr/local/mytest

创建文件 src/com/demo/Hello.java

package com.demo;

public class Hello {
public static void main(String[] args) {
System.out.println("hello");
}
}

最终,mytest 目录下的结构

编译

javac src/com/demo/Hello.java



可以看到生成了 src/com/demo/Hello.class

执行

java -cp src com.demo.Hello



-cp src 这个参数是把 src 目录添加到 classpath 目录

打包

打包只应当包含 .class 文件,所以需要创建一个目录,用来专门存放 .class 文件

mkdir /usr/local/mytest/target

编译

# -d target 参数,指定 class 文件生成在 target 目录
javac src/com/demo/Hello.java -d target



看一下 target 目录下生成了 .class 文件

打包

# -C target . 参数,指定把 target 目录下的所有文件打包
jar -cvf my.jar -C target .

执行

java -jar my.jar



报错了,这是正常的,因为我们没有指定入口,java 不知道应该执行什么。

正确的执行方式

# -cp my.jar 把 jar 包添加到 classpath 目录
# com.demo.Hello 说明哪个类是入口
java -cp my.jar com.demo.Hello

可执行的 jar 包

可以直接执行,无需指定入口

创建 /usr/local/mytest/MANIFEST.MF,在文件内说明程序入口:

Main-Class: com.demo.Hello

再次打包

# 添加了 m 参数,指定 MANIFEST.MF,这个文件的内容会被添加到 jar 包的清单,用于说明 my.jar 的入口
jar -cvfm my.jar MANIFEST.MF -C target .

执行

java -jar my.jar

成功输出 hello

依赖第三方 jar 包的 java 代码的编译执行

创建文件 src/com/demo/HelloGson.java,这个代码依赖 gson 包:

package com.demo;

import com.google.gson.Gson;

import java.util.HashMap;
import java.util.Map; public class HelloGson {
public static void main(String[] args) { Gson gson = new Gson();
Map<String, String> map = new HashMap<String, String>();
map.put("key1", "value1");
map.put("key2", "value2");
String json = gson.toJson(map);
System.out.println(json);
}
}

直接编译:

javac src/com/demo/HelloGson.java -d target

理所当然的报错 error: package com.google.gson does not exist,依赖包不存在

创建 libs 目录,把依赖包 gson-2.8.5.jar 放进去,最后整个目录结构如下:



再次编译,使用 -cp libs/gson-2.8.5.jar 参数添加依赖包:

javac -cp libs/gson-2.8.5.jar src/com/demo/HelloGson.java -d target

编译成功,生成 HelloGson.class 文件:



执行:

java -cp target com.demo.HelloGson

报错 java.lang.ClassNotFoundException: com.google.gson.Gson 还是缺少依赖。

执行时也需把 libs/gson-2.8.5.jar 添加到 classpath 路径中:

java -cp target:libs/gson-2.8.5.jar com.demo.HelloGson

成功输出:

{"key1":"value1","key2":"value2"}

Java 命令行 编译、执行、打包的更多相关文章

  1. java命令行编译执行

  2. Linux java 命令行编译 jar包

    Java 命令行编译成class,然后在打包成jar文件. 编译成class javac -classpath $CLASS_PATH -d class ./src/Hello.java 可以通过ja ...

  3. Java 命令行编译项目

    如果是用Exlipse, 第三方的包可以放在eclipse文件夹的jre包的lib文件夹中! (初学者的一些总结-高手们勿喷哈-) 原因: 以前一直用Eclispe编程环境运行Java.非常舒服,就像 ...

  4. java命令行编译运行、打包jar

    过程:java文件→class文件→exe执行文件 --------------------------------------------- 一.编译:从.java生成.class   (1)ecl ...

  5. 命令行编译执行java

    命令行编译运行java程序 使用命令 javac进行编译 和 java进行执行. javac 后面跟着的是java文件的文件名,例如 HelloWorld.java. 该命令用于将 java 源文件编 ...

  6. Android 命令行编译、打包生成apk文件

    一.搭建搭建环境 1. 安装JDK 和 Android SDK   2. 配置环境变量 D:\android-sdk-windows\tools C:\Program Files\Java\jdk1. ...

  7. Maven 手动添加第三方依赖包及编译打包和java命令行编译JAVA文件并使用jar命令打包

    一,实例:新建了一个Maven项目,在eclipse中通过 build path –> configure path-.将依赖包添加到工程中后,eclipse不报错了.但是用Maven命令 mv ...

  8. Java命令行的执行参数

    Java 程序命令行参数说明 启动Java程序的方式有两种: # starts a Java virtual machine, loads the specified class, and invok ...

  9. java 命令行 编译 运行程序

    学习java使用IDE前最好先用用命令行的javac.java来跑一跑简单的程序,这样能够熟悉一下包管理对.class文件路径的影响. 我们先写一段简单的代码: package com.csdn.lk ...

随机推荐

  1. linux专题(六):Vim编辑器

    http://dwz.date/UDf 什么是Vim编辑器 Vim是从 vi 发展出来的一个文本编辑器.代码补完.编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用. 简单的来说, vi 是 ...

  2. combogrid设置多选,并获取多选的值

    1.combogrid设置多选 1.添加该属性 multiple: true, 2.添加该列 {field:'ck',checkbox:true}, 2.获取多选的值 var arr = $(&quo ...

  3. 采用 Unicode 标点属性方式的正则表达式,可以去掉所有的标点符号,

    public class Test { public static void main(String[] args) { String str = "!!!??!!!!%*)%¥!KTV去符 ...

  4. msf stagers开发不完全指北(四): msf 中使用域前置技术隐藏流量

    msf 中使用域前置技术隐藏流量 前几篇都是说了下如何采用不同的语言开发 reverse_tcp 第二阶段,接下来将慢慢分析 reverse_http,这篇文章并不会围绕 stagers 进行讲解,这 ...

  5. 【软件安装】在 CentOS 7(Linux)上部署流媒体服务(Tengine、ffmpeg、Centos 7、nginx-http-flv-module、OBS)

    Centos7+Tengine+Nginx-http-flv-module+ffmpeg+OBS搭建流媒体服务器 一.需求和背景 视频直播是基于领先的内容接入.分发网络和大规模分布式实时转码技术打造的 ...

  6. 尝鲜刚发布的 SpringFox 3.0.0,以前造的轮子可以不用了...

    最近 SpringFox 3.0.0 发布了,距离上一次大版本2.9.2足足有2年多时间了.可能看到这个名字,很多读者会有点陌生.但是,只要给大家看一下这两个依赖,你就知道了! <depende ...

  7. Python基础-异常

    异常捕获 常见异常类型 Exception:顶级异常类,大部分异常类都是它的子类.SyntaxError:语法错误TypeError:类型错误ValueError:值错误NameError:找不到名称 ...

  8. 【mysql】- 锁篇(下)

    InnoDB存储引擎中的锁 表级锁 表级别的S锁.X锁 在对某个表执行SELECT.INSERT.DELETE.UPDATE语句时,InnoDB存储引擎是不会为这个表添加表级别的S锁或者X锁的 表级别 ...

  9. Jmeter(十八) - 从入门到精通 - JMeter后置处理器 -下篇(详解教程)

    1.简介 后置处理器是在发出“取样器请求”之后执行一些操作.取样器用来模拟用户请求,有时候服务器的响应数据在后续请求中需要用到,我们的势必要对这些响应数据进行处理,后置处理器就是来完成这项工作的.例如 ...

  10. 随机生成姓名&批量生成不重名

    # -*- coding: utf-8 -*- """ Created on Thu Jul 23 14:43:07 2020 @author: Administrato ...