Java Maven:解包依赖项。。。然后忘掉他们

Java Maven:解包依赖项。。。然后忘掉他们,java,maven-2,Java,Maven 2,我有一个库a,它依赖于库B和C。我使用maven依赖插件(见下文)将B和C的库类解压到库a的jar中 现在,当库D使用库a时,库D可以访问a、B和C的所有类。但是,我希望D只依赖于a,而不依赖于可传递依赖项B和C 我知道这可以通过手动排除依赖项A-D的B和C来实现,但我想在A中声明,使用A的模块不会知道B和C <plugin> <artifactId>maven-dependency-plugin</artifactId&g

我有一个库a,它依赖于库B和C。我使用maven依赖插件(见下文)将B和C的库类解压到库a的jar中

现在,当库D使用库a时,库D可以访问a、B和C的所有类。但是,我希望D只依赖于a,而不依赖于可传递依赖项B和C

我知道这可以通过手动排除依赖项A-D的B和C来实现,但我想在A中声明,使用A的模块不会知道B和C

        <plugin>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>unpack-dependencies</id>
                    <phase>generate-resources</phase>
                    <goals>
                        <goal>unpack-dependencies</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

maven依赖插件
解包依赖项
产生资源
解包依赖项

我认为您可以使用范围“提供”标记依赖关系,这样依赖项目将假定jar已经“提供”。通常,它们是由容器提供的,在您的情况下,您是在依赖项A中“提供”它们的

在任何情况下,依赖于A的模块都将忽略依赖项B和C。

第一个选项,使用而不是
依赖项:解包依赖项
,从而在插件配置中列出B和C,而不是将它们声明为依赖项(因此D将不知道它们)


第二种选择,将B和C声明为A的依赖项,并按照Peter的建议(请参见)提供
范围,您将不会在D中“看到”它们。

本周,我使用maven shade插件创建了一个uber jar。 然而,当我将uber jar作为一个依赖项添加到另一个项目时,底层jar是通过传递方式添加的。
为了修复它,我必须在其pom中将uber-jar的依赖项标记为true,然后重新安装uber-jar。

谢谢!依赖项解包看起来是个不错的选择。感谢您提供Maven文档的链接!我认为“提供”的描述有点误导。但是,这个范围恰恰完成了上述情况下的工作。