如何使用 bash 脚本编译使用 jar 文件的多包 java 项目

How to compile with a bash script a multipackaged java project that uses jar file

我正在为我的计算机网络课程开发一个项目。 其实我已经结束了,现在我需要写一个脚本来编译它,这样老师就可以运行它

我用 Netbeans 开发,现在我正在努力通过命令行编译它。

我有 3 个文件夹(包)

  1. 客户端:class客户端进程
  2. es
  3. 服务器:class服务器进程
  4. es
  5. sharedClasses:class对客户端和服务器都有用(比如User.java)

我还使用 Gson 作为 sharedClasses 包中需要的 jar 文件

我尝试了很多来创建一个编译它的脚本,但每次我得到 "ClassNotFoundException" 或类似的东西:理解 classpath 等的在线指南非常糟糕。

有人可以告诉我如何编写脚本并解释为什么事情会这样吗?谢谢

路径变量是所有Unix和Windows操作系统中的一个概念。它们不是 Java 发明,但 Java 基于它们自己的 class 路径和模块路径概念。

路径变量的值只是一个包含文件位置列表的字符串,在 Unix 中用冒号 (:) 分隔,在 Windows 中用分号 (;) 分隔.

最常见的路径变量就是PATH。 (我相信在Windows中,变量的规范名称是Path,但环境变量在Windows中是case-insensitive,所以可以称为PATH在大多数情况下。)

当您尝试在命令行上执行程序时,通过指定不带目录组件的命令名称,操作系统会按顺序检查 PATH 中的每个文件位置,并且对于每个位置一个目录,系统将在那里寻找匹配项。第一个匹配项是操作系统使用的匹配项。

Java 为 class 路径借用了这个概念。在 Java 的早期,情况完全一样:如果您的 class 路径是 /home/giulio:/opt/libraries,并且您正在寻找名为 com.example.ConnectionFactory 的 class , Java 将在 /home/giulio 中查找名为 com/example/ConnectionFactory.class 的编译文件,然后在 /opt/libraries.

中查找

不久之后 class 路径被允许包含文件,这些文件是 classes 的压缩存档,除了目录。您的 class 路径可能包含 /home/giulio:/opt/libraries/foolib.jar,在这种情况下 Java 将首先检查 /home/giulio 中请求的 class,因为那是一个目录,如果失败,它将在 /opt/libraries/foolib.jar 存档文件中查找匹配条目。 (Zip 文件也是可以接受的,事实上 .jar 文件实际上只是一个带有一些特殊 Java-specific 条目的 zip 文件。)

因此,当您想告诉 Java 在特定位置查找库时,请在 class 路径中指定它们。

例如,在编译您的客户端代码时:

projectroot=`dirname "[=10=]"`
javac -classpath "$projectroot"/sharedClasses/classes \
    -d "$projectroot"/client/classes \
    "$projectroot"/client/src/*.java

当您 运行 您的代码:

java -classpath "$projectroot"/sharedClasses/classes:"$projectroot"/client/classes \
    edu.acme.giulio.client.Main