Java: 实现动态消费Jars的等效方式是什么

Java: What is the equivalent way to achieve dynamically consuming Jars

假设我有一个 jar1,它有一些 类,它们是 类 的中心集,具有 0 个依赖项。 然后我有另一组 java 文件,这些文件依赖于一些 jar1 类 来编译。我想创建一个不包含 jar1 代码的 jar2,这样我就不会在 jar1 和 jar2 之间重复代码。我将同时向消费者提供 jar1 和 jar2,jar1 可以独立工作,但 jar2 需要 jar 1。如果我在编译 jar2 时不包含 jar1,编译器显然会崩溃。我是否可以直接将原始 .java 文件发送到 jar2 中,以便编译仅在导入到将加载 jar1 的应用程序时完成?

我将重新表述(我认为)您的问题。


您有一个 Java 源 类 的集合(例如“库”或“项目”),它们是您的应用程序套件(或类似的东西)的核心。您想要创建第二个 Java 源 类 集合,它依赖于构成“应用程序”的第一个集合。

您不希望第二个集合包含第一个集合源代码的 个副本。顺其自然。


这些都是标准的东西。

所以你编译第一个集合并从编译的 类.

创建一个 JAR 文件(我们称之为“library.jar”)

然后编译第二个集合,包括编译时类路径中的“library.jar”文件。然后创建第二个 JAR 文件(我们称之为“application.jar”),其中包含第二个集合的 类.

的编译版本

所以现在我们有两个不包含重复代码的 JAR 文件。你通常会 运行 他们像这样:

  java -classpath application.jar:library.jar  some.pkg.MyMain ....

所以你说编译第二个集合对你不起作用。编译器抱怨无法在您的第一个集合中找到 类。

很可能是因为您忘记在编译时类路径中包含“library.jar”文件。像这样

javac -classpath library.jar ....

请注意,Java 构建工具可以为您处理很多这样的事情,因此您不必 运行 javacjar 和其他东西。在 Android 世界中,首选构建工具是 Gradle。阅读它的功能。

我想您可以使用 Make / CMake,但与 Java 构建工具相比,CMake 对 Java 的支持似乎相当原始。


Can I just instead ship the raw .java files in the jar2 so the compiling is done only on importing into the app which will have loaded jar1?

您不需要这样做。您需要做的就是用您的编译方式更正问题。

不利的一面是 Java 源代码不会通过导入自动编译。 (Java 不是脚本语言...)如果您将源代码发送给最终用户,您还需要向他们提供构建说明、脚本等。如果您要向其发送代码的人不是程序员,那是个坏主意。