从pom.xml收集依赖项信息

时间:2016-06-06 05:32:42

标签: maven-dependency-plugin

我想在我的pom.xml中打印一个包含所有依赖项及其版本列表的文件。 (无需进入每个依赖项)

我的最终目标是将依赖项+版本信息列在文件中,该文件可以在运行时由应用程序读取,并通过网页上的“版本信息”链接显示。

我发现有一个maven dependecy plugin | dependency:list,据我所知,应该做的就是我想要的。我也管理它来打印输出文件,但它主要包含乱码。我可以理解它,它只是在项目中有一些包的列表。 (没有版本信息)

有人可以请说明如何正确使用此插件,或者是否甚至做了我需要它做的事情。 My configuration与其使用说明中的相同,但如果尝试使用任何可选参数,则始终失败。

1 个答案:

答案 0 :(得分:0)

现在看起来它正在做正确的事情。版本文件以'target / classes'打印,我可以在运行时从应用程序中查找它。

在pom.xml中(在build / plugins中):

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.10</version>
    <executions>
        <execution>
            <id>createVersionInfo</id>
            <phase>compile</phase>
            <goals>
                <goal>list</goal>
            </goals>
            <configuration>
                <artifactItems>
                    <artifactItem>
                        <groupId>com.company.project</groupId>
                        <artifactId>app-name</artifactId>
                        <version>${project.version}</version>
                        <type>war</type>
                        <overWrite>true</overWrite>
                    </artifactItem>
                </artifactItems>
                <sort>true</sort>
                <includeScope>compile</includeScope>
                <outputFile>target/classes/dependency_versions.txt</outputFile>
            </configuration>
        </execution>
    </executions>
</plugin>

'&lt; excludeScope&gt; test&lt; / excludeScope&gt;'不按预期工作。它排除了一切。我认为 includeScope 的解释以某种方式解释了这一点。

  

空字符串表示所有范围(默认)。       正在解释的范围是Maven看到的范围,       不是在pom中指定的。总结:

runtime  - scope gives runtime and compile dependencies,
compile  - scope gives compile, provided, and system dependencies,
test     - (default) scope gives all dependencies,
provided - scope just gives provided dependencies,
system   - scope just gives system dependencies.

java端的这段代码几乎可以满足需要:

InputStream in = this.getClass().getResourceAsStream("/dependency_versions.txt"); // Finds the file from classpath
String content = "";
// Java7 AutoCloseable
try (Scanner scan = new Scanner(in)) {
    scan.useDelimiter("\\Z"); // Found this from another SO-thread, enables to read in the whole file at once
    content = scan.next();
}
// Iterate the content and collect the information
// \n = line change
for (String row : content.split("\n")) {
    row = row.trim();
    // Basically removes the 1st two lines of the file that are not wanted
    if (StringUtils.isEmpty(row) || row.endsWith(":")) {
        continue;
    }
    StringTokenizer tokenizer = new StringTokenizer(row, ":");
    String package = tokenizer.nextToken();
    String dependency = tokenizer.nextToken();
    String type = tokenizer.nextToken();
    String version = tokenizer.nextToken();
    String scope = tokenizer.nextToken();
}

我实际上填充了我自己的TO列表,用于在JSF中显示信息,但为了简单/可读性,我省略了该部分。

...实际上让我想到为什么我要立即读取整个文件而不是迭代它并一次读取一行,但我会把它留给每日WTF。 ;)