我需要使用项目的dependency-jars生成一个文件。 这可以使用dependeny插件完成。 请参阅以下pom的片段:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<execution>
<id>list-dependencies</id>
<phase>package</phase>
<goals>
<goal>build-classpath</goal>
</goals>
<configuration>
<prefix></prefix>
<outputFile>target/modules-list.txt</outputFile>
<pathSeparator>\n</pathSeparator>
</configuration>
</execution>
</executions>
</plugin>
但是,由于我需要在单独的一行上使用每个jar,因此我尝试将pathSeparator
指定为换行符。但是,这不起作用。我没有找到在pom中指定换行符的有用方法。
关于如何实现这一目标的任何想法?
答案 0 :(得分:2)
Maven正在修剪您的<pathSeparator>
值,这会导致空值,因为行分隔符被视为空格。然后,由于没有值,Maven回退到使用默认值。我没有看到任何解决此问题的简单方法。
还有其他一些选择。您可以考虑使用dependency:list
目标:
<强>的pom.xml 强>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>list-dependencies</id>
<phase>package</phase>
<goals>
<goal>list</goal>
</goals>
<configuration>
<outputFile>target/modules-list.txt</outputFile>
</configuration>
</execution>
</executions>
</plugin>
<强>目标/模块-LIST.TXT 强>
The following files have been resolved:
org.slf4j:slf4j-log4j12:jar:1.7.10:compile
org.hamcrest:hamcrest-core:jar:1.3:test
junit:junit:jar:4.11:test
log4j:log4j:jar:1.2.17:compile
org.slf4j:slf4j-api:jar:1.7.10:compile
javax.ws.rs:jsr311-api:jar:1.1.1:compile
com.sun.jersey:jersey-server:jar:1.19:compile
com.sun.jersey:jersey-core:jar:1.19:compile
这是Maven工件ID而不是jar文件名。可以说,这实际上更有价值,因为输出不会在运行构建的不同机器上发生变化。 (jar文件将使用绝对路径,在不同的机器上可能会有所不同。)
如果真的必须是jar文件名而不是Maven工件ID,那么你可以通过在<pathSeparator>
值中注入非空白字符来拼凑一些东西,这样即使在Maven修剪了值之后,是剩下的事情来覆盖默认路径分隔符。
<强>的pom.xml 强>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>list-dependencies</id>
<phase>package</phase>
<goals>
<goal>build-classpath</goal>
</goals>
<configuration>
<outputFile>target/modules-list.txt</outputFile>
<pathSeparator>_${line.separator}</pathSeparator>
</configuration>
</execution>
</executions>
</plugin>
<强>目标/模块-LIST.TXT 强>
/Users/naurc001/.m2/repository/com/sun/jersey/jersey-core/1.19/jersey-core-1.19.jar_
/Users/naurc001/.m2/repository/javax/ws/rs/jsr311-api/1.1.1/jsr311-api-1.1.1.jar_
/Users/naurc001/.m2/repository/com/sun/jersey/jersey-server/1.19/jersey-server-1.19.jar_
/Users/naurc001/.m2/repository/log4j/log4j/1.2.17/log4j-1.2.17.jar_
/Users/naurc001/.m2/repository/org/slf4j/slf4j-api/1.7.10/slf4j-api-1.7.10.jar_
/Users/naurc001/.m2/repository/org/slf4j/slf4j-log4j12/1.7.10/slf4j-log4j12-1.7.10.jar_
/Users/naurc001/.m2/repository/junit/junit/4.11/junit-4.11.jar_
/Users/naurc001/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar
不幸的是,最后会留下丑陋的下划线。如果你想清理它们,那么你需要另一个构建步骤来清理它们。一种方法是在generate-resources
阶段生成此文件,然后使用maven-resources-plugin在process-resources
阶段执行令牌替换。
最后,如果您只是需要此信息用于文档目的,请考虑使用maven-project-info-reports-plugin提供的站点文档。
答案 1 :(得分:1)
在XML中,您可以使用以下转义序列 - 

不幸的是,正如您已经提到的,<pathSeparator>
值会被修剪掉所有前导和尾随空格,从而导致空字符串值导致插件使用其默认值。
但是,您可以在同一阶段使用Ant任务来替换路径分隔符。例如。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>list-dependencies</id>
<phase>package</phase>
<goals>
<goal>build-classpath</goal>
</goals>
<configuration>
<prefix></prefix>
<outputFile>target/modules-list.txt</outputFile>
</configuration>
</execution>
</executions>
</plugin>
<!-- Replace path separator -->
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<phase>package</phase>
<configuration>
<target>
<replace file ="target/modules-list.txt" token="${path.separator}" value="${line.separator}" />
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
请注意,您的依赖项配置中不再定义<pathSeparator>
。