【问题标题】:specifying newlines in pom.xml在 pom.xml 中指定换行符
【发布时间】:2017-06-13 10:15:36
【问题描述】:

我需要用项目的依赖罐子生成一个文件。 这可以通过依赖插件来完成。 请参阅下面来自 pom 的 sn-p:

    <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 中指定换行符的有用方法。

关于如何实现这一点的任何想法?

【问题讨论】:

  • 也许包含换行符的 CDATA 部分可以工作
  • @Aaron 不,它没有。这就像直接在 pom 中输入换行符。似乎这些空白字符都被修剪掉了。我发现输入换行符的唯一方法是用可打印的字符包围它们,这真的没用。
  • 为什么需要这个? pathSeparator 通常是操作系统用来分隔路径的分隔符。
  • @Tunaki 是的,并且 build-classpath 目标使用这个 pathSeparator 构建一个类路径。但是,我不需要类路径,而是每行一个 jar 列表。
  • @Tunaki 是的,它是 akward,但它是最接近我需要的方法:所有依赖项的 jar 文件列表。

标签: java maven newline pom.xml


【解决方案1】:

Maven 正在修剪您的 &lt;pathSeparator&gt; 值,这会导致空值,因为行分隔符被视为空格。然后,由于没有值,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>                  

target/modules-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,那么您可以通过将非空白字符注入 &lt;pathSeparator&gt; 值来拼凑一些东西,这样即使在 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>

target/modules-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 阶段生成此文件,然后在process-resources 阶段使用maven-resources-plugin 进行令牌替换。

最后,如果您只是出于文档目的需要此信息,请考虑使用maven-project-info-reports-plugin 提供的站点文档。

【讨论】:

  • 这不是不幸的,而是设计使然。此目标旨在构建可用作类路径的东西,而不是一般的花哨列表。
  • @Tunaki,谢谢。我对其进行了编辑以删除您不喜欢的单词。
  • @ChrisNauroth 好吧,这是出于文档目的,但我仍然需要 jar 名称。我认为您添加单个下划线的方法是最适合的解决方案。所以我接受你的回答。
【解决方案2】:

在 XML 中,您可以使用以下转义序列指定换行符 - &amp;#x0A;

不幸的是,正如您已经提到的,&lt;pathSeparator&gt; 值被删除所有前导和尾随空格,有效地导致空字符串值导致插件使用其默认值。

但是,您可以在同一阶段使用 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>

请注意,&lt;pathSeparator&gt; 不再在您的依赖项配置中定义。

【讨论】:

  • 这不是不幸的,而是设计使然。此目标旨在构建可用作类路径的东西,而不是一般的花哨列表。
  • @Tunaki 我认为您可以接受该解决方案,但副词的选择不是吗?你希望我把它改成 alasunhappilyregretly 还是 sadly?由于问题是我该怎么做?而不是我为什么不能这样做?,所以我掩饰了解释原因而专注于答案。拉德兰的结果不是由于目标的目的。默认情况下,&lt;configuration&gt; 下的元素内容会被修剪,除非包含 xml:space="preserve" 属性。感谢您给我一个扩展的机会。
  • @Frelling 虽然你的提议可行,但我会按照 ChrisNauroth 描述的方式进行。但仍然感谢您的帮助。
  • @radlan 感谢您的反馈;虽然我很好奇。我的回答 - 不言自明 - 为您提供了您所要求的内容,但您对悬空的下划线感到满意。考虑到文档的目的是为了文档,这意味着它不仅会被您阅读,那么除了最后一行之外,您希望有人多久会质疑尾随下划线的重要性?
  • @Frelling 哦,看来我误解了你的方法。我已经对其进行了测试,ChrisNauroths 的方法更好。因此,我现在接受您的回答(并将实际使用它)。
猜你喜欢
  • 2013-11-20
  • 2020-06-02
  • 1970-01-01
  • 2012-12-15
  • 1970-01-01
  • 2018-01-03
  • 2015-06-26
  • 1970-01-01
相关资源
最近更新 更多