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

时间:2018-12-30 08:08:58

标签: java compilation javac debian-stretch

我有一个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 /中相应的ItemActionPacketListener.java文件旧。诡计/ net / packet / impl /

  • 我正在/ home / rsps / server目录中运行此命令。
  • .jar文件位于/ home / rsps / server / lib文件夹中。
  • .src文件位于/ home / rsps / server / src文件夹中。
  • .bin文件应在/ home / rsps / server / bin文件夹中输出。
  • “ main”类为空Main可以在src / com / ruse / GameServer.java中找到

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

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

  • 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;

                 ^

1 个答案:

答案 0 :(得分:2)

一个不同的非回答:您正在谈论一个现实世界的项目和需求。

在现实世界中,您无需手动调用javac。相反,您使用诸如maven或gralde之类的构建系统。您定义一个包含所需库的项目结构。

然后让构建系统完成所有令人讨厌的细节。 除此之外,还意味着:您需要花费精力来创建自己的缺陷构建系统。

所以:不要重新发明轮子!这个问题已经解决,与这种成熟的构建系统相比,无论您想出什么,其功能都将变得更弱,而且更容易出错。

更新:当您的团队喜欢遵循效率较低的策略,而您又没有任何杠杆作用时,最好的选择就是以身作则。像:使用gradle创建一个有效的构建设置和项目定义。然后向您的队友展示该设置与Eclipse配合使用的效果如何。如何使用它来完全控制构建的内容,时间和方式。

人们通常对变化感到紧张,但是当您可以向他们展示有效解决方案的优势时,他们往往会敞开心!!