Java 如何检查jar文件依赖关系
我来自.NET背景,这些天我需要做一些JAVA工作。有一件事我不太了解,那就是JAvA运行时是如何解析其jar依赖关系的。例如,我想使用javax.jcr进行一些节点添加。所以我知道我需要添加这两个依赖项,因为我需要使用javax.jcr.Node和org.apache.jackrabbit.commons.JcrUtilsJava 如何检查jar文件依赖关系,java,maven,Java,Maven,我来自.NET背景,这些天我需要做一些JAVA工作。有一件事我不太了解,那就是JAvA运行时是如何解析其jar依赖关系的。例如,我想使用javax.jcr进行一些节点添加。所以我知道我需要添加这两个依赖项,因为我需要使用javax.jcr.Node和org.apache.jackrabbit.commons.JcrUtils <dependency> <groupId>javax.jcr</groupId>
<dependency>
<groupId>javax.jcr</groupId>
<artifactId>jcr</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>org.apache.jackrabbit</groupId>
<artifactId>jackrabbit-jcr-commons</artifactId>
<version>2.8.0</version>
</dependency>
</dependency>
javax.jcr
jcr
2
org.apache.jackrabbit
jackrabbit jcr commons
2.8.0
现在我通过了编译,但在运行时遇到了一个异常。然后有人告诉我再添加一个依赖项,解决了这个问题
<dependency>
<groupId>org.apache.jackrabbit</groupId>
<artifactId>jackrabbit-jcr2dav</artifactId>
<version>2.6.0</version>
</dependency>
org.apache.jackrabbit
jackrabbit-jcr2dav
2.6.0
据我所知,jackrabbit jcr commons需要运行jackrabbit-jcr2dav。如果jar缺少依赖项,它如何通过编译?还有,我如何知道我错过了jcr common中的这个特定依赖项?这是一个一般性的问题,不必特定于java jcr。Maven在编译时计算可传递依赖项,因此编译通过ok。这里的问题是,默认情况下,maven不会构建适当的
java-cp
命令行来启动具有所有依赖项(直接和可传递)的应用程序
有两种解决方案:
pom.xml
snippet回答以下问题:。然后您可以通过java-cp myfatjar.jar my.app.MainClass启动assembly.xml
,它将告诉Maven如何打包工件以及要包含哪些依赖项。您需要在生成的包中提供某种脚本,该脚本将包含适当的java-cp…
命令。据我所知,在编译/打包期间没有“官方”Maven插件来构建这样的脚本免费的Maven或多或少地解释了依赖项和程序集是如何工作的。Maven在编译时计算可传递的依赖项,因此编译通过了ok。这里的问题是,默认情况下,maven不会构建适当的
java-cp
命令行来启动具有所有依赖项(直接和可传递)的应用程序
有两种解决方案:
pom.xml
snippet回答以下问题:。然后您可以通过java-cp myfatjar.jar my.app.MainClass启动assembly.xml
,它将告诉Maven如何打包工件以及要包含哪些依赖项。您需要在生成的包中提供某种脚本,该脚本将包含适当的java-cp…
命令。据我所知,在编译/打包期间没有“官方”Maven插件来构建这样的脚本jackrabbit jcr commons
对jackrabbit api
具有可选依赖性。这意味着除非在POM中重新声明,否则不会自动获取该依赖项(及其依赖项)
一般来说,可选的依赖项是一个项目中结构问题的创可贴解决方案。要引用有关主题()的maven文档,请执行以下操作:
在不可能的情况下使用可选依赖项(例如
(无论什么原因)将项目拆分为子模块。这个想法是
某些依赖项仅用于中的某些功能
如果不使用该功能,则不需要该项目。
理想情况下,这样一个特性将被拆分为一个子模块,该子模块依赖于
在核心功能项目上…这个新的子项目
只有非可选的依赖项,因为如果您
决定使用子项目的功能
然而,由于项目不能被分割(再次,无论如何
原因),这些依赖项被声明为可选的。如果用户想要
使用与可选依赖项相关的功能,他们必须
在他们自己的项目中重新声明该可选依赖项。这不是
这是处理这种情况的最明确的方法,但再次强调,两者都有
可选依赖项和依赖项排除是权宜之计
解决方案
一般来说,探索依赖项的POM将揭示此类问题,尽管这一过程可能会非常痛苦。如果我不得不猜测(不必花费太多时间钻研此特定项目的Maven层次结构),我相信您的问题是由以下事实造成的:jackrabbit jcr commons
对jackrabbit api
具有可选依赖性。这意味着除非在POM中重新声明,否则不会自动获取该依赖项(及其依赖项)
一般来说,可选的依赖项是一个项目中结构问题的创可贴解决方案。要引用有关主题()的maven文档,请执行以下操作:
在不可能的情况下使用可选依赖项(例如
(无论什么原因)将项目拆分为子模块。这个想法是
某些依赖项仅用于中的某些功能
如果不使用该功能,则不需要该项目。
理想情况下,这样一个功能将是