运行具有库依赖项的 Java 应用程序

这是 主类“可执行 JAR” 示例的延续。

典型的 Java 应用程序包含特定于应用程序的代码,以及你已实现或已由第三方实现的各种可重用库代码。后者通常被称为库依赖项,通常打包为 JAR 文件。

Java 是一种动态绑定语言。当你运行具有库依赖项的 Java 应用程序时,JVM 需要知道依赖项的位置,以便它可以根据需要加载类。从广义上讲,有两种方法可以解决这个问题:

  • 可以将应用程序及其依赖项重新打包到包含所有必需类和资源的单个 JAR 文件中。

  • 可以通过运行时类路径告诉 JVM 在哪里找到依赖的 JAR 文件。

对于可执行 JAR 文件,运行时类路径由“Class-Path”清单属性指定。 (编者注:这应该在 jar 命令的单独主题中描述。) 否则,需要使用 -cp 选项或使用 CLASSPATH 环境变量来提供运行时类路径。

例如,假设我们在“myApp.jar”文件中有一个 Java 应用程序,其入口点类为 com.example.MyApp。还假设应用程序依赖于库 JAR 文件“lib / library1.jar”和“lib / library2.jar”。我们可以在命令行中使用 java 命令启动应用程序,如下所示:

$ # Alternative 1 (preferred)
$ java -cp myApp.jar:lib/library1.jar:lib/library2.jar com.example.MyApp

$ # Alternative 2
$ export CLASSPATH=myApp.jar:lib/library1.jar:lib/library2.jar
$ java com.example.MyApp

(在 Windows 上,你将使用 ; 而不是:作为类路径分隔符,并且你将使用 set 而不是 export 设置(local)CLASSPATH 变量。)

虽然 Java 开发人员对此感到满意,但它并不用户友好。因此,通常的做法是编写一个简单的 shell 脚本(或 Windows 批处理文件)来隐藏用户不需要了解的详细信息。例如,如果将以下 shell 脚本放入名为 myApp 的文件中,则将其设置为可执行文件,并将其放入命令搜索路径中的目录中:

#!/bin/bash
# The 'myApp' wrapper script

export DIR=/usr/libexec/myApp
export CLASSPATH=$DIR/myApp.jar:$DIR/lib/library1.jar:$DIR/lib/library2.jar
java com.example.MyApp

然后你可以按如下方式运行它:

$ myApp arg1 arg2 ...

命令行上的任何参数都将通过 $@ 扩展传递给 Java 应用程序。 (你可以使用 Windows 批处理文件执行类似操作,但语法不同。)