java、javac和jar的使用

本文详细介绍Java项目的编译流程及jar包制作过程,包括如何组织文件目录结构、编译不同包下的Java源文件并正确放置编译后的class文件,以及如何通过命令行创建包含依赖的jar包。

文件目录结构

root
    src
        p1\Universe.java Sun.java
        p2\Star.java
    classes1
        p1\Sun.class
        p1\Universe.class
    classes2 
        p2\Star.class

Universe.java和Sun.java同在p1包内,Star.java是在p2包内。

Universe定义如下,引用了同包的Sun类和异包的Star类。

package p1;

import p2.Star; // 引用了p2包的Star类

public class Universe {
    public static void main(String[] args) {
	Sun sun = new Sun();        // Sun类在p1包
	Star star = new Star();     // Star类在p2包
        System.out.println("Universe");
    }
}

编译java文件

为了编译Universe,首先要分别编译Sun和Star类,以下命令均在root下输入,注意编译的目的地目录classes#必须存在。

1. 编译Sun类,并把class文件放在classes1目录下:

javac src\p1\Sun.java -d classes1


2. 编译Star类,并把class文件放在classes2目录下:

javac src\p2\Star.java -d classes2


3. 最后编译Universe类,并把class文件放在classes1目录下:

javac -cp classes1;classes2 src\p1\Universe.java -d classes1
注意-cp给的是class文件所在包(p1, p2)的位置。Windows使用分号;分割,Linux使用冒号:分割。

如果class文件都放在同一个目录classes下,用一行命令完成上面三条命令:

javac src\p1\*.java src\p2\*.java -d classes


运行Universe:

java -cp classes1;classes2 p1.Universe
-cp路径中要包含Universe自己所在的位置和所使用的类所在的位置。-cp一定是用包的位置。main类要含包名(p1.Universe)。


打成jar包

jar cf universe.jar -C classes1 . -C classes2 .
c是create,f是file,jar文件名,包含的文件。这里用了-C dir . 是说把dir的内容放进jar包中,而不包含dir自己这个目录。


打包时如果要含manifest,则新建一个manifest.txt:

Main-Class: p1.Universe
注意要含包名。manifest最后一定要空一行。

jar cmf manifest.txt universe.jar -C classes1 . -C classes2 .
m是manifest。


不想新建manifest文件的话:

jar cfe universe.jar p1.Universe -C classes1 . -C classes2 .

在manifest中添加classpath,这样在运行时就不用指定-cp了:

Class-Path: Star.jar

在manifest中添加版本信息:

Name: java/util/
Specification-Title: Java Utility Classes
Specification-Version: 1.2
Specification-Vendor: Example Tech, Inc.
Implementation-Title: java.util
Implementation-Version: build57
Implementation-Vendor: Example Tech, Inc.

包密封(sealing),保证在包中使用的类都是在jar包中的:

Name: com/package/
Sealed: true

显示jar包内容:

jar tf universe.jar


解压jar包:

jar xf universe.jar

运行jar包:

java -jar universe.jar


如果manifest不含Main-Class:

java -cp universe.jar p1.Universe


如果universe.jar不包含Star.class:

java -cp universe.jar;classes2 p1.Universe



### Javajavac 的区别与关系 Java 是一种广泛使用的编程语言,其设计目标是使开发人员能够编写一次,到处运行(Write Once, Run Anywhere)。Java 程序在 Java 虚拟机(JVM)上运行,而 JVM 是跨平台的,这意味着 Java 应用程序可以在任何支持 JVM 的设备上运行,无需重新编译 [^1]。 #### javac 的作用 `javac` 是 Java 编译器命令,用于将 Java 源代码文件(.java 文件)编译成 Java 字节码文件(.class 文件)。这个过程是将高级语言转换为 JVM 可以理解执行的低级语言。例如,如果有一个名为 `YourFile.java` 的源文件,可以通过运行 `javac YourFile.java` 命令来编译它,生成对应的 `.class` 文件 [^1]。 #### java 命令的作用 另一方面,`java` 命令用于启动 Java 应用程序。它通过调用 JVM 来执行编译后的 `.class` 文件。例如,如果 `YourFile.class` 是编译后的文件,可以通过运行 `java YourFile` 来执行该程序 。 #### 版本差异的影响 有时,用户可能会遇到 `java` `javac` 版本不一致的情况。这是因为 JDK(Java Development Kit)包含了开发 Java 应用程序所需的工具,包括 `javac` 编译器,而 JRE(Java Runtime Environment)仅包含运行 Java 应用程序所需的组件。当安装了多个版本的 JDK 或 JRE 时,系统路径设置不当可能导致 `java` `javac` 使用不同的版本。解决这个问题的一种方法是调整系统的 PATH 环境变量,确保指向期望的 JDK 版本 [^2]。 #### 使用示例 在 Linux 系统下,可以使用如下命令来编译运行 Java 程序: ```bash /usr/local/java/bin/javac -classpath /tmp/javatest/lib/mail-1.3.3.jar -d /tmp/javatest/bin /tmp/javatest/src/jp/co/realseed/Capability.java ``` 这条命令指定了类路径(`-classpath`)、输出目录(`-d`)以及要编译的源文件的位置 [^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值