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

标签 java compilation javac debian-stretch

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

我决定在服务器上编译新的 .java 文件,然后执行它们。我的问题是,在将 -cp arg 指定为“lib/*.jar”时,在编译过程中我得到: 错误 package 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 文件旧诡计/网络/数据包/impl/

  • 我在/home/rsps/server 目录中运行此命令。
  • .jar 文件存在于/home/rsps/server/lib 文件夹中。
  • .src 文件存在于/home/rsps/server/src 文件夹中。
  • .bin 文件预计将输出到/home/rsps/server/bin 文件夹中。
  • “main”类是 void 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 类: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"

结果:

symbol: class ChannelBuffer

location: class PacketBuilder

src/com/ruse/world/World.java:11: error: package com.google.common.util.concurrent does not exist

import com.google.common.util.concurrent.ThreadFactoryBuilder;

                                   ^

src/com/ruse/util/Misc.java:26: error: package org.jboss.netty.buffer does not exist

import org.jboss.netty.buffer.ChannelBuffer;

                        ^

src/com/ruse/util/Misc.java:750: error: cannot find symbol

   public static String readString(ChannelBuffer buffer) {

                                   ^

symbol: class ChannelBuffer

location: class Misc

src/com/ruse/world/content/dialogue/DialogueManager.java:6: error: package com.google.gson does not exist

import com.google.gson.Gson;

                 ^

最佳答案

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

在现实世界中,您不会手动调用 javac。相反,您可以使用 Maven 或 gralde 等构建系统。您定义一个包含所需库的项目结构。

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

所以:不要重新发明轮子!这个问题已经解决了,无论你想出什么办法,都会比这些成熟的构建系统功能更弱,而且更容易出错。

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

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

关于java - 如何在 -cp 参数中为许多 *.jar 文件正确提供 arg 以在 Unix 上进行编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53976110/

相关文章:

java - 防止在编译时或运行时在项目类中使用特定注释

java - GWT 编译无法加载类

java - 无法登录 IBM WebSphere 管理控制台

java - 使应用程序成为已知服务,以对应用程序进行 Kerberize 化

java - 将组件数组(panel.getComponents())存储到数组列表

java - 打破来自不同类的循环

c - 为什么指针导致非指针编译错误?

c - llvmgen.c 中的 xmos 内部编译器错误?

java - 使用更高版本的JDK编译时如何验证依赖项的java版本?

java - 如何将.jar文件添加到javac编译中(Windows 10)