【问题标题】:How to compile with a bash script a multipackaged java project that uses jar file如何使用 bash 脚本编译使用 jar 文件的多打包 Java 项目
【发布时间】:2019-05-23 00:30:04
【问题描述】:

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

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

我有 3 个文件夹(包)

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

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

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

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

谁能告诉我如何编写我的脚本并解释为什么事情是这样完成的?谢谢

【问题讨论】:

  • "命令行" 没问题,但我会为此使用构建文件,而不是每次都手动输入命令。 make、ant、Maven、Gradle 等
  • @markspace 我必须为此编写一个 bash 脚本。我不能使用像 ant 这样的外部工具(项目规则),据我所知,java 中的 makefile 不是一个好主意(?)
  • 你可以这样做,但感觉很随意,不是最佳实践。 ant是JDK的一部分,为什么不用呢?
  • @markspace 因为编写 bash 脚本是项目本身的一部分。截止日期也快到了,我不想着急学习新东西。

标签: java bash jar javac


【解决方案1】:

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

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

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

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

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

不久之后,类路径被允许包含文件,这些文件是类的压缩档案,除了目录。您的类路径可能包含/home/giulio:/opt/libraries/foolib.jar,在这种情况下,Java 将首先在 /home/giulio 中检查请求的类,因为这是一个目录,如果失败,它将在 /opt/libraries/ 中查找匹配的条目傻瓜.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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 2012-01-11
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    相关资源
    最近更新 更多