我正在为我的计算机网络类(class)开发一个项目。 其实我已经结束了,现在我需要写一个脚本来编译它,这样老师就可以运行它
我使用 Netbeans 进行开发,现在我正在努力通过命令行编译它。
我有 3 个文件夹(包)
- client:客户端进程的类
- server:服务器进程的类
- 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/