Java中有关包的相关配置以及介绍

下面是一个详细的教程,涵盖如何将多个 Java 文件组织成包、引入包以及如何打包成 JAR 文件的过程。

1. 创建 Java 包

1.1 目录结构

假设我们要创建一个名为 com.example.myapp 的包,目录结构如下:

[!NOTE] 一般包名就是目录结构名。因此,我们运行或者编译包时一般都是在目录根结构下运行命令,比如 com.example.myapp 这个包是根据 myapp/src/com/example/myapp 目录下命名的,我们就要在 src 根目录下运行命令

1
2
3
4
5
6
7
8
9
myapp/

├── src/
│ └── com/
│ └── example/
│ └── myapp/
│ ├── HelloWorld.java
│ └── Utils.java
└── bin/

1.2 编写 Java 文件

HelloWorld. java:

1
2
3
4
5
6
7
8
package com.example.myapp;

public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
Utils.printMessage("This is a message from Utils.");
}
}

Utils. java:

1
2
3
4
5
6
7
package com.example.myapp;

public class Utils {
public static void printMessage(String message) {
System.out.println(message);
}
}

2. 编译 Java 文件

  1. 打开终端,导航到 src 目录:

    1
    cd path/to/myapp/src

  2. 使用 javac 编译 Java 文件:

    1
    javac com/example/myapp/*.java -d ../../bin

    这里 -d ../../bin 表示将编译生成的 .class 文件放到 bin 目录下。

3. 运行 Java 程序

  1. 确保你在 bin 目录中:

    1
    cd ../../bin

  2. 运行程序:

    1
    java com.example.myapp.HelloWorld

4. 创建 JAR 文件

  1. 仍然在 bin 目录中,使用 jar 命令创建 JAR 文件:

    1
    jar cvf myapp.jar com/example/myapp/*.class

    这里 c 表示创建,v 表示详细输出,f 表示指定 JAR 文件名。

  2. 确认 JAR 文件已创建:

    1
    ls

    你应该能看到 myapp.jar 文件。

5. 运行 JAR 文件

  1. 运行 JAR 文件时需要指定主类。在 HelloWorld 类中,我们可以在 MANIFEST.MF 中指定主类,或者直接在命令行中运行:
    1
    java -cp myapp.jar com.example.myapp.HelloWorld

这种方式可以运行 JAR 文件中任意个类,只要你使用 cp 命令指定就行

6. 添加主类到 JAR 文件

为了使 JAR 文件可直接运行,可以添加主类到 MANIFEST.MF 文件中:

  1. 创建一个名为 MANIFEST.MF 的文件,内容如下:

    1
    2
    Manifest-Version: 1.0
    Main-Class: com.example.myapp.HelloWorld

  2. 创建 JAR 文件时指定 MANIFEST.MF

    1
    jar cvfm myapp.jar MANIFEST.MF com/example/myapp/*.class

7. 直接运行 JAR 文件

现在你可以直接运行 JAR 文件,而不需要再指定主类:

1
java -jar myapp.jar

8. 用第三方包

java 文件中要用到的包是别人打包好的,我们编译时要通过添加参数来实现使用别人的包,如下:

编译

1
javac --module-path /path/to/javafx-sdk/lib --add-modules javafx.controls HappyFaceFX.java

运行

1
java --module-path /path/to/javafx-sdk/lib --add-modules javafx.controls HappyFaceFX

9. 用自己本地打好的包

首先,这是原始目录结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
```bash
myapp
├── bin
│   ├── com
│   │   └── example
│   │   ├── myapp
│   │      ├── HelloWorld.class
│   │       └── Utils.class
│   │  
│   │  
│   └── myapp.jar
└── src
└── com
└── example
├── app
│   ├── HelloWorld.java
│   └── Utils.java
└── test
└── MainApp.java

然后创建一个新的结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
myapp
├── bin
│   ├── com
│   │   └── example
│   │   ├── myapp
│   │   │   ├── HelloWorld.class
│   │   │   └── Utils.class
│   │   └── test
│   │   └── MainApp.class
│   └── myapp.jar
└── src
└── com
└── example
├── app
│   ├── HelloWorld.java
│   └── Utils.java
└── test
└── MainApp.java

这个 test 文件夹的 java 文件如下:

1
2
3
4
5
6
7
8
9
10
package com.example.test;

import com.example.myapp.Utils; // 导入 Utils 类

public class MainApp {
public static void main(String[] args) {
Utils.printMessage("Hello from MainApp!");
}
}

导入了 com. example. myapp 这个包中的 Utils 类,并且将这个设置为com. example. test 包

编译这个文件方法

  1. 将 example 文件夹下的所有 java 文件一起编译,这样就不会出现依赖问题
  2. 编译时设置路径(-cp),在 src 文件夹下使用如下命令:javac -cp ../bin com/example/test/MainApp.java -d ../bin
  3. 结合(-cp)以及 jar 包也行,在 src 文件夹下使用如下命令:javac -cp ../bin/myapp.jar com/example/test/MainApp.java -d ../bin

==最后,就是因为我设置这个包时有个目录,使用 javac 编译文件输出到具体目录时也是会产生相应目录结构,就是会多出文件夹==

运行这个文件方法

运行指令:

1
java com.example.test.MainApp  

看情况需不需要链接类文件,好像在同一个包的根目录 com/example 下就不需要使用 -cp。不在同一个根目录下就要使用 -cp

总之,如果不能运行就自己手动加上 -cp 就行了

10. --module-path-cp 区别

--module-path-cp (或 --class-path) 是 Java 中的两个不同选项,它们用于不同的场景,因为 Java 支持两种不同的代码组织方式:模块系统类路径

区别:

1. -cp--class-path

-cp 是用于指定 类路径 的选项,适用于传统的 Java 项目结构,即所有的 .class 文件和 JAR 文件都是通过类路径来管理和加载的。

  • 使用场景:用于在传统的 Java 项目中查找 .class 文件和 JAR 包。
  • 适合的项目:适合未使用 Java 9 引入的模块系统的项目,或者依旧通过类路径进行管理的库和依赖。

示例

1
2
javac -cp /path/to/library.jar YourProgram.java
java -cp /path/to/library.jar YourProgram

2. --module-path-p

--module-path 是用于 模块系统 的选项,这是 Java 9 引入的特性。在模块系统中,代码和依赖项(例如 JAR 文件)被打包为模块,每个模块都有一个明确的依赖关系和暴露的 API。

  • 使用场景:用于指定模块路径(即模块化的 JAR 文件),适合 Java 9 及以上的项目,特别是那些使用了 Java 的模块系统的项目。
  • 适合的项目:适合将代码和依赖项组织为模块的项目。例如,JavaFX 是基于模块系统的库。

示例

1
2
javac --module-path /path/to/modules --add-modules javafx.controls YourProgram.java
java --module-path /path/to/modules --add-modules javafx.controls YourProgram

为什么 JavaFX 需要 --module-path

JavaFX 自从 Java 9 起就成为了一个独立的模块(不再包含在 JDK 中)。因此,当你在编译和运行 JavaFX 应用时,你需要告诉 Java 编译器和运行时如何找到 JavaFX 模块,这就是为什么使用 --module-path 来指定 JavaFX 模块的路径。

示例解释

1
javac --module-path /path/to/javafx-sdk/lib --add-modules javafx.controls HappyFaceFX.java
  • --module-path:指定 JavaFX SDK 的路径,其中包含 JavaFX 的模块化 JAR 文件。
  • --add-modules javafx.controls:明确告诉编译器或运行时要加载 javafx.controls 模块,这是 JavaFX 提供的核心 UI 控件模块。

什么时候用 -cp--module-path

  • 使用 -cp:当你使用的是非模块化的 Java 项目或依赖时,继续使用类路径(-cp)。
  • 使用 --module-path:当你的项目或依赖是模块化的,特别是使用 Java 9 引入的模块系统时,比如 JavaFX。

小结

  • -cp 适用于传统的类路径管理。
  • --module-path 适用于模块化的项目和库(如 Java 9 引入的模块系统)。

总结

你已经完成了以下步骤: 1. 创建 Java 包。 2. 编写 Java 文件并编译。 3. 运行 Java 程序。 4. 创建 JAR 文件。 5. 添加主类到 JAR 文件并直接运行。

这种方法可以帮助你组织代码、简化项目管理,并且便于分发。


Java中有关包的相关配置以及介绍
http://example.com/2024/09/21/Java中有关包的相关配置以及介绍/
作者
JunBin Liang
发布于
2024年9月21日
许可协议