Java 如何发布API?

Java 如何发布API?,java,api-design,Java,Api Design,如何使用Java发布API?在C语言或C++语言中,这很简单,因为你可以简单地将头和代码分开,但是在java中,这是完全不同的故事。所以我知道在Java中没有真正的方法可以混淆代码,即使你“混淆”了它,因为它可以很容易地反编译和分析。但是,如果我不能简单地将标题分发给某人,那么用Java发布API的首选方法是什么?我没有特殊需求,因为我正处于设计过程的开始阶段,所以我非常有活力,我想知道我所有的备选方案。您不需要将API发布为头文件。开发人员需要的一切都已经在JAR中了。如果要发布文档,请发布代

如何使用Java发布API?在C语言或C++语言中,这很简单,因为你可以简单地将头和代码分开,但是在java中,这是完全不同的故事。所以我知道在Java中没有真正的方法可以混淆代码,即使你“混淆”了它,因为它可以很容易地反编译和分析。但是,如果我不能简单地将标题分发给某人,那么用Java发布API的首选方法是什么?我没有特殊需求,因为我正处于设计过程的开始阶段,所以我非常有活力,我想知道我所有的备选方案。

您不需要将API发布为头文件。开发人员需要的一切都已经在JAR中了。如果要发布文档,请发布代码的java文档。

您可以使用专业的java模糊处理程序对代码进行模糊处理。那么它就不容易反编译和可读了。然后,您可以像其他人提到的那样发布JAR和Javadoc。

您可以将库拆分为多个JAR,其中一个JAR包含构成api的类和接口,另一个JAR包含这些接口的实现

然而,请注意,这种草率行为可能并不值得。你到底为什么要试图混淆api用户需要的代码?我的意思是,无论谁使用您的api,都需要接口的实现来运行应用程序,所以他们仍然能够反编译您的代码


生成仅api的jar将有助于分离api和实现(这意味着您可以替换实现或防止意外直接访问实现)。

一个干净的方法是纯粹在Java接口中定义api,将它们包含到单独的API模块中,并使实现模块依赖于API模块。这并不能提供与分离C++头文件相同的功能,但是无论如何都可以将程序完全分离到一个特定的实现中。这是一个好主意。

我将它分发为JavaGraveIVAR(JAR)。它实际上不是如何发布自己的技术问题,而是如何设计API,如果我应该包含一个完整的程序运行副本,或者如果我可以发布一些可编译的jar,而这些jar没有能力运行我的整个程序。无论哪种方式,最好是编程到接口,最好是将这些接口与实现分离在一个独立的模块中(从而独立的jar).这与原件不符question@OlegS. 是的,提供头文件就是提供可用的API。这在使用Java时根本不需要,它在很大程度上取决于如何定义API。对我来说,它是:,为了定义软件组件之间如何交互,不需要实现,接口就足够了。当然,如果接口是随机使用的,或者根本不使用,那么就没有必要将它们分离成一个独立的模块。您的任务是打包Java代码,因为也有战争,所以它不是通用的。@OlegS。你说得对,它不必有实现。但这并不能改变我以为OP问他如何提供的事实。至少可以说,通过WAR/EAR/etc而不是JAR提供接口并不常见。谁应该这样做?然而,仅仅为了隐藏类的代码而编写接口代码可能不是一个好主意。当存在一个真正的接口时(即,给定类的接口是(或可能是)多个实现),接口的设计更适合使用。我见过太多的代码,每个类都有自己的接口。这会造成很多混乱。如果你真的只是想发布API,javadoc和jar是最好的选择。编写接口代码只是为了隐藏实现,这确实不是一个好主意,因为它只会导致生成额外的不必要的代码堆,我的建议不是这样的。主要的好处是为功能提供了一个干净的契约,它的发展速度比实际实现慢得多(契约),从而为API的(外部)用户提供了改进的稳定性和他们自己代码库的清晰性。如果在1.2.2和当前版本的API版本中看到当前版本的API,这并不奇怪。我认为这就是你的意思,但是看起来OP似乎对从分发中隐藏私有代码(如C++标题)很感兴趣,所以我想我会提到它。