如果默认情况下,当我生成jar应用程序时,不包括依赖项,这是否意味着用户应该下载我应用程序的所有依赖项才能使用它?
为什么在jar中包含依赖项不是默认设置?
我如何期望用户以所需的确切版本拥有/下载所有依赖项?
答案 0 :(得分:0)
来自https://imagej.net/Uber-JAR:
优势:
单个JAR文件更易于部署。多个JAR文件的版本不匹配的可能性不大。构造Java类路径比较容易,因为只需要包含一个JAR。
缺点:
每次需要更新软件版本时,都必须重新部署整个uber-JAR(例如,截至2015年5月,ImageJ为〜68 MB)。如果捆绑了单个JAR组件,则只需更新已更改的组件。这个问题与通过Java Web Start部署的Java应用程序特别相关,因为它会自动下载每个JAR依赖项的最新可用版本;在这种情况下,如果使用uber-JAR,您的应用程序启动时间将受到影响。
您不能只挑选包含所需功能的JAR,因此应用程序的内存可能会膨胀。
如果下游代码依赖于无阴影的uber-jar中嵌入的任何相同依赖项,则可能会在类路径上使用这些依赖项的多个副本遇到麻烦(例如,无阴影的uber-JAR的NoSuchMethodError)。您需要使用与uber-JAR捆绑在一起的版本的依赖关系。
如您所见,了解uber-JAR的使用将如何影响您的应用程序非常重要。特别是,使用单个组件JAR可以更好地服务Java应用程序,最好使用依赖关系管理平台(例如Maven或Ivy)对其进行管理。但是对于非Java应用程序,uber-JAR可能足以满足您的需求。
这基本上取决于用例。如果将jar用于其他应用程序的开发中,并且其依赖关系可能会不时更新,则可以使用普通的jar,但是如果要运行/部署jar,则最好使用uber /胖子。