我有一个多模块Maven项目.一个子项目托管XSL/XML资源文件.另一个项目托管需要在单元测试中使用这些文件的Java代码.
在依赖项的jar中,资源位于文件夹中xml-resources.
我找到了这个例子,并试图根据我的需要改变它:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<id>resource-dependencies</id>
<phase>process-test-resources</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
<configuration>
<classifier>xml-resources</classifier>
<outputDirectory>${project.build.directory}/classes/xml-resources</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
当我运行process-test-resources阶段时,这没有任何作用.我确定那里有一些错误 - 我没有看到我可以在哪里指定资源应该从中获取的依赖关系,并且<classifier>似乎没有实际指定应该从中复制资源的源.
我迷失在这里,有人可以告诉我该怎么做对吗?
我正在尝试使用maven-jar-plugin和maven-dependency-plugin来创建我的应用程序的可运行"包".它在大多数情况下工作正常,但是当我在依赖关系层次结构中有快照时,复制依赖关系目标似乎将快照依赖关系转换为锁定快照(带时间戳的快照)
但是,archiver-plugin中的addClasspath不会转换快照依赖项:
所以我无法运行该应用程序.
我找不到一种方法来告诉copy-dependencies不转换SNAPSHOTs或者告诉archiver-plugin转换SNAPSHOTs.
这是pom.xml的相关片段:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.5.1</version>
<executions>
<execution>
<id>copy-libs</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<excludeScope>provided</excludeScope>
<outputDirectory>${package.dest}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<outputDirectory>${package.dest}</outputDirectory>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>${main.class}</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud) 我正在使用它dependency:analyze来检测依赖性问题.但我发现传递依赖项存在问题,因为插件无法解析此依赖项.
当我执行mvn dependency:tree时,输出显示传递依赖项.
依赖
project A
dependency B
project C
dependency A
Run Code Online (Sandbox Code Playgroud)
Outuput - >(项目C - 路径)/ mvn clean install
[WARNING] Used undeclared dependencies found:
dependency B: compile
Run Code Online (Sandbox Code Playgroud)
插入
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<id>analyze</id>
<phase>verify</phase>
<goals>
<goal>analyze-only</goal>
</goals>
<configuration>
<failOnWarning>true</failOnWarning>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
为什么插件不会检测传递依赖性
是否有一个有效的用例,在POM的依赖关系管理部分中有两个不同版本的同一工件?
我正在看一个根POM包含这样一个例子的项目.项目本身有多个模块,使用不同版本的"重复依赖".因此,一些模块必须在它们的依赖关系中明确地指定工件的版本,以便区分这两者.
如果模块的POM文件必须指定版本,那么在父级的依赖关系管理中复制的原因是什么?即使从依赖关系管理中删除了依赖关系也会被正确查找,那么为什么要首先将它复制到那里呢?
我只是想弄清楚这是不是很好的做法,或者是否有更好的解决方案来应对这种情况.
maven-dependency-plugin将spring boot依赖项检测为未使用,但实际上它们需要运行我的应用程序.我会犯错吗?
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>my-service</artifactId>
<packaging>jar</packaging>
<name>my-service</name>
<description>my service</description>
<parent>
<groupId>com.my</groupId>
<artifactId>parent</artifactId>
<version>0.2.0-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<exclusions>
<exclusion>
<groupId>javax.ws.rs</groupId>
<artifactId>jsr311-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security.oauth</groupId>
<artifactId>spring-security-oauth2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-commons</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependency> …Run Code Online (Sandbox Code Playgroud) 如果我有两个在同一个pom中相同的依赖项,我希望构建失败.目前,我可以使用Maven Dependency Plugin的"analyze-duplicate"检测它.然而,像其他一些人一样没有failOnWarning选项(另外,它在Info级别打印,而不是警告).有没有替代扩展这个?
在 Maven 项目中,我运行 OWASP dependency-check-maven 插件以及 OWASP 命令行工具,以便生成包含存在漏洞的依赖项的报告。
我无法理解的是这两个工具是如何运作的。具体来说,我注意到 Maven 插件 (dependency-check-maven) 报告了 45 个易受攻击的依赖项,而命令行工具报告了 34 个。
例如,Maven 插件将undertow-core-1.2.9.Final.jar(由依赖项提供的undertow-servlet)报告为存在严重漏洞,而通过命令行检查,该依赖项根本不会出现在列表中。我正在使用以下命令运行命令行工具:
dependency-check --project "myProject" --scan "C:\path\myProject" --disableRetireJS
Run Code Online (Sandbox Code Playgroud)
难道命令行工具会扫描项目目录中现有的 jar 文件,而 Maven 插件会遍历 中定义的依赖项吗pom.xml?
java owasp maven maven-dependency-plugin owasp-dependency-check
我正在研究的项目之一具有以下相关配置:
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<failOnWarning>true</failOnWarning>
</configuration>
<executions>
<execution>
<goals>
<goal>analyze-only</goal>
</goals>
</execution>
</executions>
</plugin>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest</artifactId>
<version>2.2</version>
<!-- not scoped to test -->
</dependency>
Run Code Online (Sandbox Code Playgroud)
执行mvn clean verify(apache-maven-3.6.3,java:17-ea)时,构建按预期成功。我现在对属性进行了更改,将 源和目标替换为发布:
<maven.compiler.release>17</maven.compiler.release>
Run Code Online (Sandbox Code Playgroud)
终端上的日志显示
Run Code Online (Sandbox Code Playgroud)[INFO] --- maven-dependency-plugin:3.2.0:analyze-only (default) @ java-8-matchers --- [WARNING] Non-test scoped test only dependencies found: [WARNING] org.hamcrest:hamcrest:jar:2.2:compile
导致失败(因为警告)!为什么/如何在 Java 版本中升级时对依赖关系进行不同的处理?有任何解决这个问题的方法吗?
如果可能有帮助,此目标的调试日志如下:
[DEBUG] Configuring mojo org.apache.maven.plugins:maven-dependency-plugin:3.2.0:analyze-only from plugin realm ClassRealm[plugin>org.apache.maven.plugins:maven-dependency-plugin:3.2.0, parent: jdk.internal.loader.ClassLoaders$AppClassLoader@579bb367]
[DEBUG] Configuring mojo 'org.apache.maven.plugins:maven-dependency-plugin:3.2.0:analyze-only' with basic configurator -->
[DEBUG] (f) analyzer …Run Code Online (Sandbox Code Playgroud) 我的项目中的传递依赖项存在版本冲突,我正在尝试使用它mvn dependency:tree -Dverbose来查找版本冲突。然而,每当我运行时mvn dependency:tree -Dverbose,它就会挂起并且永远不会完成。我尝试使用调试模式(mvn --debug dependency:tree -Dverbose)来找出发生了什么,似乎它正在连接到成百上千个存储库,而我在项目中的任何地方都没有定义这些存储库,编写跟踪文件,使用连接器,使用传输器等。 ..... 请参阅这里的pastebin,了解它在几个小时内所做的事情的一小段:https://pastebin.com/raw/L3z4u5Hj
当我不包含该标志时,这种情况不会发生-Dverbose:mvn dependency:tree它本身非常快速,并且在几秒钟内完成。
此外,对于我拥有的任何其他存储库或代码库都不会发生这种情况:只有一个特定的存储库或代码库。但显然我不知道这个代码库与其他代码库有什么不同,只是依赖关系不同(假设某些依赖关系是问题的原因。)
似乎官方 Maven 邮件列表上的人也遇到了这个问题,但似乎他们也永远无法解决它: https: //www.mail-archive.com/users@maven.apache.org/msg143124。 html
任何帮助,将不胜感激。如果我无法弄清楚这一点,我将不得不一一删除依赖项,直到找到导致问题的依赖项,这将需要很长时间,因为这是一个非常大的代码库。
Maven版本:
Apache Maven 3.6.0
Maven home: /usr/share/maven
Java version: 11.0.10, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.15.0-54-generic", arch: "amd64", family: "unix"
Run Code Online (Sandbox Code Playgroud) 我有一个大型多模块 Maven 项目,它有大量的依赖项。我想生成一个完整的、经过重复过滤的第三方依赖项列表(即,所有不使用项目组 ID 的依赖项)。
我已尝试用于mvn dependency:list -DexcludeGroupIds=org.example.projectx此目的,但似乎无法将输出聚合到单个列表中。当我从项目根命令行运行该命令时,我得到如下输出:
[...]
[INFO] ------------------------------------------------------------------------
[INFO] Building ProjectX: ModuleA - Datatypes 4.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:list (default-cli) @ projectx-moda-datatypes ---
[INFO]
[INFO] The following files have been resolved:
[INFO] org.slf4j:slf4j-api:jar:1.7.10:compile
[INFO] org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] junit:junit:jar:4.12:test
[INFO] com.google.guava:guava:jar:18.0:compile
[INFO]
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building ProjectX: ModuleB - Binary 4.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:list (default-cli) @ projectx-modb-binary ---
[INFO]
[INFO] The following files have been resolved:
[INFO] org.slf4j:slf4j-api:jar:1.7.10:compile
[INFO] com.google.guava:guava:jar:18.0:compile
Run Code Online (Sandbox Code Playgroud)
..等等,对于每个子模块。这不仅不是单个列表(而是每个子模块的单独列表),而且正如您所看到的,它包含重复项。此外,我感兴趣的实际输出隐藏在其他 …