首页 > 编程语言 >【Java教程】Day4-14 面向对象编程(OOP): Classpath详解与Jar包使用指南

【Java教程】Day4-14 面向对象编程(OOP): Classpath详解与Jar包使用指南

时间:2024-12-25 09:55:30浏览次数:6  
标签:文件 Java 14 classpath jar 面向对象编程 JVM Hello

在Java编程中,我们经常接触到classpath这一概念。虽然很多文章讨论了如何设置classpath,但其中大部分并不完全准确。在这篇文章中,我们将深入探讨classpath的作用、如何正确配置它、以及如何使用jar包来管理Java项目。

 

 

1. 什么是Classpath?

Classpath是JVM(Java虚拟机)用来查找和加载Java类文件的一个重要概念。由于Java是编译型语言,源文件是.java文件,而JVM执行的是编译后的.class文件。因此,JVM需要知道如何找到这些.class文件,classpath正是通过指定搜索路径来实现这一功能。

简单来说,classpath是一个包含多个目录路径的集合,用来告知JVM在哪里查找.class文件。这个路径通常与操作系统相关,具体来说:

a. 在Windows系统中,路径使用分号(;)分隔。例如:

 

 

bashC:\work\project1\bin;C:\shared;"D:\My Documents\project1\bin"

 

b. 在Linux系统中,路径使用冒号(:)分隔。例如:

 

 

bash/usr/shared:/usr/local/bin:/home/liaoxuefeng/bin
 

2. Classpath如何工作?

当JVM加载某个类时,比如abc.xyz.Hello,它会按照classpath中设置的路径顺序进行搜索:

  1. 当前目录:首先在当前目录下查找abc/xyz/Hello.class

  2. 指定的目录:然后在C:\work\project1\bin目录下查找。

  3. 共享的目录:接着在C:\shared目录下查找。

如果在某个路径下找到匹配的类,JVM就停止搜索。如果在所有指定路径中都未找到该类,JVM会抛出ClassNotFoundException异常。

 

3. 如何设置Classpath?

3.1  不推荐在系统环境变量中设置Classpath

虽然可以通过操作系统的环境变量设置classpath,但这种做法并不推荐。这样做会污染系统的环境变量,并且不利于项目的隔离和管理。

3.2 推荐在命令行启动JVM时设置Classpath

在启动Java程序时,推荐通过命令行传递-cp-classpath参数来指定classpath,例如:

bashjava -cp .;C:\work\project1\bin;C:\shared abc.xyz.Hello

 

或者使用简写的-cp

bashjava -cp .;C:\work\project1\bin;C:\shared abc.xyz.Hello

如果没有显式指定classpath,JVM会默认将当前目录(.)作为classpath

在IDE(如IntelliJ IDEA或Eclipse)中,IDE会自动配置classpath,通常指向项目的bin目录以及项目依赖的jar包。

 

3.3  Java核心库的Classpath

许多教程错误地建议将JVM自带的rt.jar添加到classpath中,但实际上,JVM不依赖classpath来加载核心库(如StringArrayList等)。因此,不需要显式地将Java核心库添加到classpath中。JVM会自动找到这些类。

 

3.4 类路径中的包结构

假设我们有一个包名为com.example的类Hello,且编译后的.class文件位于C:\work\com\example\Hello.class。运行该类时,classpath应该指向当前目录,命令如下:

bashjava -cp . com.example.Hello

JVM会在当前目录下查找com/example/Hello.class文件,并执行该类。

 

4. 使用Jar包管理类文件

4.1 什么是Jar包?

Jar包(Java ARchive)是将多个Java类文件及相关资源文件打包成一个压缩文件(通常是.jar后缀),以方便管理、传输和备份。Jar包本质上是一个ZIP文件,包含了Java项目的多个.class文件以及其他资源。

4.2 如何创建Jar包?

使用命令行工具jar可以创建jar包,示例如下:

bashjar cf hello.jar -C ./bin .

这条命令会将./bin目录下的所有文件打包成hello.jar文件。如果需要添加多个目录或文件,可以通过类似的命令进行操作。

 

4.3 运行Jar包

当你将多个类文件打包到一个jar文件中时,可以通过将jar包路径添加到classpath来运行它:

bashjava -cp hello.jar abc.xyz.Hello

JVM会在hello.jar文件中查找abc.xyz.Hello类,并执行。

4.4 使用MANIFEST.MF文件

Jar包还可以包含一个特殊的文件:META-INF/MANIFEST.MF。这个文件包含jar包的元数据,如Main-Class,它指定了程序的入口点。例如:

 

 

plaintextManifest-Version: 1.0Main-Class: com.example.Hello

 

一旦MANIFEST.MF文件配置正确,可以使用以下命令直接运行jar包,而不需要指定类名:

 

 

bashjava -jar hello.jar

 

4.5 自动创建Jar包

在大型项目中,手动创建jar包并编写MANIFEST.MF文件非常繁琐。幸运的是,Java社区提供了很多自动化构建工具,如Maven、Gradle等,它们可以帮助我们自动化整个构建和打包过程。

 

5. 小结

  1. Classpath是JVM用来查找.class文件的路径集合。它可以通过-cp参数设置,避免直接修改系统环境变量。

  2. Jar包是一个压缩文件,包含多个.class文件及其他资源,方便管理和分发。

  3. 使用MANIFEST.MF文件可以指定jar包的入口类,简化运行命令。

  4. 强烈建议使用自动构建工具(如Maven或Gradle)来创建和管理jar包。

 

6. 上机题

题目: 创建一个简单的Java项目,包含多个类文件,使用jar包进行打包,并指定Main-Class,最终能够通过java -jar命令运行项目。

步骤:

  1. 创建一个名为com.example的包,并在该包下创建Main.javaHello.java两个类。

  2. 使用命令将这些类文件打包成一个hello.jar文件,并指定Main-Classcom.example.Main

  3. 编写并运行一个测试程序,确保能够通过java -jar hello.jar命令成功启动程序。

代码:

java// Main.javapackage com.example;public class Main {    public static void main(String[] args) {        Hello hello = new Hello();        hello.sayHello();    }}// Hello.javapackage com.example;public class Hello {    public void sayHello() {        System.out.println("Hello, World!");    }}

 

 

打包命令:

bashjar cf hello.jar -C ./bin .

 

运行命令:

bashjava -jar hello.jar

 

运行结果应显示:

bashHello, World!

 

通过这种方式,你可以将多个类文件打包成一个jar包,并通过java -jar命令来运行程序。

 

 

标签:文件,Java,14,classpath,jar,面向对象编程,JVM,Hello
From: https://blog.csdn.net/max202011161630/article/details/144678868

相关文章

  • 【Java教程】Day5-01 核心类:String 字符串全面解析
    在Java中,String 是一个非常常用的数据类型,它代表一个字符串。不同于其他类型,String 是一个引用类型,实际在内存中由一个字符数组(char[])来表示。Java的 String 类提供了很多功能强大的方法来操作字符串数据,本篇文章将深入解析 String 类型的相关知识,帮助你更好地理解和......
  • Java 开发之关键注解详细汇总
    一、JDK自带的基本注解@Override作用:用于标识方法重写。它告诉编译器这个方法是重写父类中的方法,如果父类没有这个方法或者方法签名不匹配,编译器会报错。示例:classParent{publicvoidprint(){System.out.println("Parentprint");}}classChilde......
  • Java基础知识全面解析
    Java基础知识全面解析Java是一种广泛使用的、面向对象的编程语言,它被广泛应用于开发桌面应用、Web应用、企业级应用、移动应用以及嵌入式系统等。Java语言自诞生以来,一直以其跨平台、性能优异、开发高效等特点,深受开发者青睐。本文将从Java的基础知识入手,详细介绍Jav......
  • 【Java基础面试题035】什么是Java泛型的上下界限定符?
    回答重点Java泛型的上下界限定符用于对泛型类型参数进行范围限制,主要有上界限定符和下届限定符。1)上界限定符(?extendsT):定义:通配符?的类型必须是T或者T的子类,保证集合元素一定是T或者T的子类作用:通常用于读取操作,通配符?类型必须是T/T的子类,然后集合元素也必须是T/T的子......
  • 常用的查找算法(Java实现)
    常用的查找算法(Java实现)查找算法是计算机科学中的基础算法之一,它们帮助我们在数据中寻找特定元素。查找操作在实际开发中非常常见,例如在数据库查询、网络数据检索、图像处理等领域都离不开高效的查找算法。常见的查找算法包括线性查找、二分查找、哈希查找等。本文将详细介......
  • 【Java基础面试题041】Java中的深拷贝和浅拷贝有什么区别?
    回答重点深拷贝:深拷贝不仅复制对象本身,还递归复制对象中所有引用的对象。这样新对象与原对象完全独立,修改新对象不会影响到原对象。即包括基本类型和引用类型,堆内的引用对象也会复制一份浅拷贝:浅拷贝只复制对象的引用,而不复制引用指向的实际对象,也就是说,浅拷贝创建一个新对象......
  • 【Java基础面试题043】BigDecimal为什么能保证精度不丢失?
    回答重点BigDecimal使用十进制来表示数值,而不是二进制浮点数表示法,这使得它能够精确地表示所有十进制数值,不需要任何转换或舍入。而且BigDecimal是无限精度,可以表示任意精度的小数(受限于内存),因此不会动不动被舍入截断,也可以手动设置精度和舍入模式来控制计算的精度BigDecima......
  • 【Java基础面试题046】Java中的注解原理是什么?
    注解其实就是一个标记,是一种提供元数据的机制,用于给代码添加说明信息。可以标记在类上、方法上、属性上等,标记自身也可以设置一些值。注解本身不影响程序的逻辑执行,但可以通过工具或框架来利用这些信息进行特定的处理,如代码生成、编译时检查、运行时处理等。扩展知识自定义......
  • 面向对象程序设计JAVA学习总结
    第一章“初识JAVA与面向对象程序设计”廖利凯1、JAVA概述1.1计算机编程语言发展史机器语言:由微处理器理解和使用的二进制代码,是第一代编程语言,如0001111111101111等,直接控制硬件操作,但难记且不通用。汇编语言:用英文单词指令编写程序,是第二代编程语言,如MOVAX,1等,相比机......
  • JAVA期末通讯录
    写了挺久的,来CSDN记录一下应用软件:mysql,idea--------------------------------------------------------第一步:连接数据库直接去哔哩哔哩上面找mysql下载,下载完了之后我自身没有配什么环境,直接找的mysql怎么跟idea连接视频先用idea把mysql连接了之后再去看的mysql......