繁体   English   中英

如何在 -cp 参数中为许多 *.jar 文件正确提供 arg 以在 Unix 上进行编译?

[英]How do I properly provide arg for many *.jar files in -cp argument for compilation on Unix?

我有一个 git 存储库,当推送到特定分支时,它会将 .java 文件下拉到生产服务器。 (工作)我正在使用 openJDK 包运行 Debian 9。 (jdk 1.8.0)

我决定在服务器上编译新的 .java 文件,然后执行它们。 我的问题是,在将 -cp arg 指定为“lib/*.jar”时,在编译期间我得到:错误包 jar.example.class 不存在 import jar.example.class;

对于从另一个 .lib 文件引用的任何信息的每次引用,依此类推。

重要提示:我得到的最接近的是这个命令,它不产生输出但不编译整个项目。

  • javac -classpath "bin:lib/*.jar" -d "bin/" "src/com/ruse​​/GameServer.java"

例如:在 /server/bin/com/ruse​​/net/packet/impl/ 中的 .class 文件比 /server/src/com/ruse​​/net/packet/impl/ 中对应的 ItemActionPacketListener.java 文件旧

  • 我在 /home/rsps/server 目录中运行此命令。
  • .jar 文件存在于 /home/rsps/server/lib 文件夹中。
  • .src 文件存在于 /home/rsps/server/src 文件夹中。
  • .bin 文件应在 /home/rsps/server/bin 文件夹中输出。
  • 在 src/com/ruse​​/GameServer.java 中找到的“main”类是 void Main

这是文件夹结构的图像:文件夹结构

作为参考,这是我一直用来运行服务器的命令(有效)

  • java -server -Xmx2148m -classpath bin:lib/* com.ruse.GameServer

我尝试以不同的方式提供 -cp 或 -classpath 参数,但是,javac 在编译期间似乎无法引用 .jar 文件。

以下是我尝试过的各种 javac 命令:

  • javac -classpath "lib/*.jar" -d "bin/" "src/com/ruse​​/GameServer.java"

  • javac -sourcepath /home/rsps/server/src/ .java -classpath classes:lib/ .jar -d bin

  • javac -classpath "lib/*.jar" -d "bin/" -sourcepath "src/" "src/com/ruse​​/GameServer.java"

  • javac -cp "lib/:lib/*" -d "bin/" -sourcepath "src/" "src/com/ruse​​/GameServer.java"

  • javac -cp .:/lib/*.jar: -d "bin/" "src/com/ruse​​/GameServer.java"

我希望输出是新的 .class 文件,但实际结果都是以下变化:

  • javac -classpath "lib/*.jar" -d "bin/" "src/com/ruse​​/GameServer.java"

结果是:

符号:类 ChannelBuffer

位置:类 PacketBuilder

src/com/ruse​​/world/World.java:11: 错误:com.google.common.util.concurrent 包不存在

导入 com.google.common.util.concurrent.ThreadFactoryBuilder;

 ^

src/com/ruse​​/util/Misc.java:26: 错误:包 org.jboss.netty.buffer 不存在

导入 org.jboss.netty.buffer.ChannelBuffer;

 ^

src/com/ruse​​/util/Misc.java:750: 错误:找不到符号

 public static String readString(ChannelBuffer buffer) { ^

符号:类 ChannelBuffer

地点:类杂项

src/com/ruse​​/world/content/dialogue/DialogueManager.java:6: 错误:com.google.gson 包不存在

导入 com.google.gson.Gson;

 ^

一个明显的非回答:您在谈论一个现实世界的项目和要求。

在现实世界中,您不会手动调用 javac。 相反,您使用像 maven 或 grade 这样的构建系统。 定义包含所需库的项目结构。

然后你让构建系统完成所有烦人的细节。 其他任何事情都意味着:您花费精力来创建自己的有缺陷的构建系统。

所以:不要重新发明轮子! 这个问题已经解决了,你想出的任何东西都不会像这样成熟的构建系统那样强大,而且更容易出错。

更新:当您的团队更愿意遵循效率较低的策略,而您没有任何影响力时,最好的选择是以身作则。 比如:使用 gradle 创建一个有效的构建设置和项目定义。 然后向您的团队成员展示该设置与 eclipse 的配合效果。 如何使用它来完全控制构建的内容、时间和方式。

人们通常对变化感到紧张,但是当您向他们展示可行解决方案的优势时,他们通常会很开放!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM