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

标签 java bash jar javac

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

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

我有 3 个文件夹(包)

  1. client:客户端进程的类
  2. server:服务器进程的类
  3. sharedClasses:对客户端和服务器都有用的类(如 User.java)

我还使用 Gson 作为共享类包中需要的 jar 文件

  • 例如在sharedClasses中有一个名为Message的类,它使用Gson来转换为json字符串

我尝试了很多方法来创建一个脚本来编译所有内容,但每次我收到“ClassNotFoundException”或类似的东西时:理解类路径等的在线指南都非常糟糕。

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

最佳答案

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

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

最常见的路径变量就是 PATH 。 (我相信在Windows中,该变量的规范名称是 Path ,但环境变量在Windows中不区分大小写,因此在大多数情况下可以将其称为 PATH 。)

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

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

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

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

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

projectroot=`dirname "$0"`
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

关于java - 如何使用 bash 脚本编译使用 jar 文件的多打包 java 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56202348/

相关文章:

java - Vaadin -> Vaadin GWT 聚合物元素集成

regex - Sed 在第二次出现时替换

python - 从 Bash 文件运行 Python 脚本导致导入错误

Bash 变量导致预期输出困惑

java - 无法从自定义 Maven Nexus 存储库下载的 jar 导入类

java - 在 Java 线程池中使用守护线程不起作用

java - 如何创建 Windows 可执行文件?

java - 在Java中将参数从一个进程传递到另一个进程

java - Maven - 在同一模块中生成 war 和 fat jar

apache - 坚持部署 WAR 文件。 "FAIL - Application at context path/could not be started"