Java 程序实际上就是我们编译好的 Java 类文件。运行 Java 程序就是运行 Java 类的 main 函数。

编译并运行 Java 文件

源文件:

package com.example;

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

项目目录结构:

my-project
└── com
└── example
└── HelloWorld.java

编译和运行:

# 在项目根目录运行下面的命令
javac com/example/HelloWorld.java # 编译。获得 Java 字节码文件 HelloWorld.class
java com.example.HelloWorld # 运行 HelloWorld 类的 main 函数

运行 JAR 文件

大多数时候双击 JAR 文件就可以直接运行 JAR 文件。

也可以使用以下命令运行 JAR 文件:

java -jar myapp.jar

实际上,JAR 文件就是一个 ZIP 压缩包,里面存放着编译好的 .class 文件。因此,也可以自己指定 JAR 文件中的 .class 文件执行:

java -cp myapp.jar com.example.HelloWorld

使用 classpath

如果你的程序使用了外部库,那么在编译和运行时,你还需要包含这些库的路径到 classpath 中。如:java -cp path/to/classfile HelloWorld。路径间用 : 分隔(如果不加 -cp 选项,默认的 classpath 为当前目录 .

classpath 告诉了 Java 解释器在哪里查找类

例:

我写了一个 maxmind.IpDemo(下称 IpDemo)类,该类的 .class 文件位于项目根目录的 maxmind 目录下,该类中使用了 com.fasterxml.jackson.databind.JsonNode(下称 JsonNode)类以及 com.maxmind.db.Reader (下称 Reader)类。

源代码如下:

package maxmind;

import java.io.File;
import java.net.InetAddress; import com.fasterxml.jackson.databind.JsonNode;
import com.maxmind.db.Reader; public class IpDemo {
public static void main(String[] args) throws Exception {
File database = new File("resources/Country.mmdb");
Reader reader = new Reader(database);
InetAddress address = InetAddress.getByName("114.114.114.114");
JsonNode response = reader.get(address);
System.out.println(response);
reader.close();
}
}

其中 JsonNode 类及其依赖类分别位于 jackson-databind-2.16.1.jarjackson-core-2.16.1.jarjackson-annotations-2.16.1.jar 三个 JAR 包中;

Reader 类位于 maxmind-db-1.2.1.jar 一个 JAR 包中;

这些 JAR 包位于 Maven 的包仓库的某处。

因此,在运行 maxmind.IpDemo 类时你需要添加如下 classpath

  • JsonNode 类及其依赖类的三个 classpath,即三个 JAR 包的位置
  • Reader 类的一个 classpath,即一个 jar 包的位置
  • IpDemo 类自身的 classpath,即项目根目录

使用如下命令运行 maxmind.IpDemo 类:

java -cp \
$M2_HOME/com/fasterxml/jackson/core/jackson-databind/2.16.1/jackson-databind-2.16.1.jar: \
$M2_HOME/com/fasterxml/jackson/core/jackson-core/2.16.1/jackson-core-2.16.1.jar: \
$M2_HOME/com/fasterxml/jackson/core/jackson-annotations/2.16.1/jackson-annotations-2.16.1.jar: \
$M2_HOME/com/maxmind/db/maxmind-db/1.2.1/maxmind-db-1.2.1.jar: \
. \
maxmind.IpDemo

如果你少写了其中一个 classpath(比如说少写了 jackson-annotations-2.16.1.jar 包的位置),则可能出现如下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: com/fasterxml/jackson/annotation/JsonView
at com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector.<clinit>(JacksonAnnotationIntrospector.java:37)
at com.fasterxml.jackson.databind.ObjectMapper.<clinit>(ObjectMapper.java:400)
at com.maxmind.db.Decoder.<clinit>(Decoder.java:28)
at com.maxmind.db.Reader.<init>(Reader.java:131)
at com.maxmind.db.Reader.<init>(Reader.java:116)
at com.maxmind.db.Reader.<init>(Reader.java:66)
at com.maxmind.db.Reader.<init>(Reader.java:53)
at maxmind.IpDemo.main(IpDemo.java:12)
Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.annotation.JsonView
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
... 8 more

表示找不到类定义(即找不到类的 .class 文件)

这里的错误表示找不到 com.fasterxml.jackson.annotation.JsonView 类的定义。根据类名我们猜测它应该位于 jackson-annotations-2.16.1.jar 包中,因此我们需要在 classpath 中添加 jackson-annotations-2.16.1.jar 包的位置。

如果出现错误:

错误: 找不到或无法加载主类 maxmind.IpDemo
原因: java.lang.ClassNotFoundException: maxmind.IpDemo

则表示你没有添加 IpDemo 类的路径,即项目根目录 .

运行 Java 程序的更多相关文章

  1. windows批处理运行java程序

    明确需求 今天你编了一个java swing版照片查看器,想让计算机上的所有照片默认打开方式都改成你的照片查看器. 使用工具软件 很多工具软件都是不把jre打包到exe中的,这就是说打包之后的exe只 ...

  2. 在 Sublime Text 3 中配置编译和运行 Java 程序

    参考网址:http://www.open-open.com/lib/view/open1388105023765.html 1. 设置 java 的 PATH 环境变量 2. 创建批处理或 Shell ...

  3. 在dos中运行java程序,若出现Exception in thread “main" java.lang.NoClassDefFoundError

    在dos中运行java程序,若出现Exception in thread “main" java.lang.NoClassDefFoundError,可以检查一下几项: 环境变量配置: 注意 ...

  4. Java魔法堂:以Windows服务的形式运行Java程序

    一.前言 由于防止维护人员误操作关闭Java控制台程序,因此决定将其改造为以Windows服务的形式运行.弄了一个上午总算搞定了,下面记录下来,以供日后查阅. 二.Java Service Wrapp ...

  5. cmd命令行编译和运行java程序报错 NoClassDefFoundError

    首先,当在运行java程序出现这个错误时,首先考虑是不是路径或者未指定正确的包名,例如当运行下面这个文件时: package cn.wgh.socket; public class HelloWorl ...

  6. 1.配置EditPuls-编译和运行java程序

    1.工具>配置自定义工具 2.添加工具>程序 1).编译java程序 2).运行java程序

  7. JAVA设置环境变量和在DOS下运行java程序

    在学校实训的这几天,老师带着我们开始深入的复习java.这是第一天的内容哦 对于“JAVA设置环境变量和在DOS下运行java程序”,许多初学者是陌生的,但了解这个却对后期的学习很重要. http:/ ...

  8. 创建用于编译和运行Java程序的批处理文件

    创建用于编译和运行Java程序的批处理文件 每次编译或运行Java程序时,都要在DOS命令行中输入很长的javac或java命令,悟空觉得太麻烦,就编写了一个适用于Windows操作系统的批处理文件b ...

  9. java的windows自动化-自动运行java程序

    那么在一些工具齐全并且已经有了一定的写好的java程序的情况下(环境变量和软件见上一章http://www.cnblogs.com/xuezhezlr/p/7718273.html),如何自动化运行j ...

  10. cmd运行java程序---路径容易出错的问题

    初学者在首次使用cmd运行java程序时面临着很多的问题,重要的基本为“设置环境变量过程”与运行过程中的“路径出错问题”.由于环境变量设置的网络分享更多,且为大众情况,因此比较容易解决!   由于本人 ...

随机推荐

  1. 【资料分享】全志科技T507-H评估板规格书(4核ARM Cortex-A53,主频1.416GHz)

    1 评估板简介 创龙科技TLT507-EVM是一款基于全志科技T507-H处理器设计的4核ARM Cortex-A53国产工业评估板,主频高达1.416GHz,由核心板和评估底板组成.核心板CPU.R ...

  2. helloworld - 程序员的第一个社区终于来了

    helloworld - 程序员的第一个社区终于来了 csdn事件 CSDN旗下的GitCode最近因为一种极其不道德的行为引起了开发者的广泛愤怒和抗议.CSDN在没有通知或征求开发者同意的情况下,悄 ...

  3. [UG 二次开发 python] 导出BOM表(包含图片)

    只导出最底层的零件,零件的属性已经设置好,零件的截图生成后,放在零件的同一个文件夹下 用到了 xlsxwriter # nx: threaded # 导出BOM表 __version__ = &quo ...

  4. CF1137C 题解

    考虑把每个点进行拆成 \(d\) 个点表示星期几走到这个点,那么原图上的边 \((u,v)\) 就被拆成\((pos_{u,i},pos_{v,i+1})\) 表示星期的变化. 然后考虑进行缩点,在一 ...

  5. 1. 简述一下你对 HTML 语义化的理解?

    用正确的标签做正确的事情.1.HTML 语义化让页面的内容结构化,结构更清晰,便于对浏览器.搜索引擎解析; 2.即使在没有样式 CSS 的情况下也能以一种文档格式显示,并且是容易阅读的; 3.搜索引擎 ...

  6. Window版 MySQL可视化工具 Navicat 面安装免激活绿色版

    网盘地址 链接:https://pan.baidu.com/s/1T0WyhGAFEt28GaU4wXhfrg 提取码:z4ww navicat15破解版 链接:https://pan.baidu.c ...

  7. mac 安装mysql5.7.28附安装包

    mac 安装mysql教程 下载mysql安装包 百度云盘地址: https://pan.baidu.com/s/1qbF8vtON2sLzNetXCITnSQ 运行安装包 一直下一步即可 配置环境变 ...

  8. Oracle 触发器 before insert update

    场景,往A表插入数据时,A表和B表是同一类型的状态下,A表中累计的值,不能超过B表中的值(注:往数据库插入时,不能批量执行事务!),利用触发器before insert update,监控状态,若超过 ...

  9. 简单的字符串处理函数_C语言

    字符串数组 // Code file created by C Code Develop #include "stdio.h" #include "stdlib.h&qu ...

  10. 蓝图中如何存储树结构: NPC对话的打开方式

    BFS来扩展成数组, 然后每一个node节点的child存储为索引.