如何在 -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 不存在导入 jar.example.class;
对于从另一个 .lib 文件引用的任何信息的每次引用,依此类推。
重要:
我得到的最接近的是这个命令,它不产生输出但不编译整个项目。
- javac -classpath "bin:lib/*.jar" -d "bin/" "src/com/ruse/GameServer.java"
例如: in /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 文件夹中。
- “主要”class 是在 src/com/ruse/GameServer 中找到的无效主要内容。java
这是文件夹结构的图片:
作为参考,这是我一直用于 运行 服务器(有效)的命令
- java-服务器-Xmx2148m-class路径bin:lib/*com.ruse.GameServer
我试过以不同的方式提供 -cp 或 -classpath 参数,但是,javac 在编译期间似乎无法引用 .jar 文件。
以下是我尝试过的各种 javac 命令:
javac -classpath "lib/*.jar" -d "bin/" "src/com/ruse/GameServer.java" =16=]
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"
结果:
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 创建工作构建设置和项目定义。然后向您的团队成员展示该设置与 eclipse 配合得多么好。如何使用它来完全控制构建的内容、时间和方式。
人们常常对变化感到紧张,但当您向他们展示可行解决方案的优势时,他们通常会持开放态度!
我有一个 git 存储库,当对特定分支进行推送时,它会将 .java 文件下载到生产服务器。 (工作中)我 运行 正在使用 openJDK 软件包安装 Debian 9。 (jdk 1.8.0)
我决定在服务器上编译新的 .java 文件,然后执行它们。我的问题是,在编译期间将 -cp arg 指定为“lib/*.jar”时,我得到:错误包 jar.example.class 不存在导入 jar.example.class;
对于从另一个 .lib 文件引用的任何信息的每次引用,依此类推。
重要: 我得到的最接近的是这个命令,它不产生输出但不编译整个项目。
- javac -classpath "bin:lib/*.jar" -d "bin/" "src/com/ruse/GameServer.java"
例如: in /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 文件夹中。
- “主要”class 是在 src/com/ruse/GameServer 中找到的无效主要内容。java
这是文件夹结构的图片:
作为参考,这是我一直用于 运行 服务器(有效)的命令
- java-服务器-Xmx2148m-class路径bin:lib/*com.ruse.GameServer
我试过以不同的方式提供 -cp 或 -classpath 参数,但是,javac 在编译期间似乎无法引用 .jar 文件。
以下是我尝试过的各种 javac 命令:
javac -classpath "lib/*.jar" -d "bin/" "src/com/ruse/GameServer.java" =16=]
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"
结果:
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 创建工作构建设置和项目定义。然后向您的团队成员展示该设置与 eclipse 配合得多么好。如何使用它来完全控制构建的内容、时间和方式。
人们常常对变化感到紧张,但当您向他们展示可行解决方案的优势时,他们通常会持开放态度!