如何使用 bash 脚本编译使用 jar 文件的多包 java 项目
How to compile with a bash script a multipackaged java project that uses jar file
我正在为我的计算机网络课程开发一个项目。
其实我已经结束了,现在我需要写一个脚本来编译它,这样老师就可以运行它
我用 Netbeans 开发,现在我正在努力通过命令行编译它。
我有 3 个文件夹(包)
- 客户端:class客户端进程
es
- 服务器:class服务器进程
es
- sharedClasses:class对客户端和服务器都有用(比如User.java)
我还使用 Gson 作为 sharedClasses 包中需要的 jar 文件
- 例如在 sharedClasses 中有一个名为 Message 的 class 使用 Gson 转换为 json 字符串
我尝试了很多来创建一个编译它的脚本,但每次我得到 "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
我正在为我的计算机网络课程开发一个项目。 其实我已经结束了,现在我需要写一个脚本来编译它,这样老师就可以运行它
我用 Netbeans 开发,现在我正在努力通过命令行编译它。
我有 3 个文件夹(包)
- 客户端:class客户端进程 es
- 服务器:class服务器进程 es
- sharedClasses:class对客户端和服务器都有用(比如User.java)
我还使用 Gson 作为 sharedClasses 包中需要的 jar 文件
- 例如在 sharedClasses 中有一个名为 Message 的 class 使用 Gson 转换为 json 字符串
我尝试了很多来创建一个编译它的脚本,但每次我得到 "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