2017-01-27 15 views
2

Мне нужно сгенерировать файл с зависимыми банками проекта. Это можно сделать с помощью плагина dependeny. Ниже фрагмент кода из П:с указанием новых строк в pom.xml

<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>     

Однако, так как мне нужно каждый баночка на отдельную строку, я попытался указать pathSeparator быть символом новой строки. Однако это не работает. Я не нашел полезного способа указать символ новой строки в pom.

Любые идеи о том, как это можно достичь?

+0

Возможно, раздел CDATA, содержащий строку перевода, будет работать – Aaron

+0

@ Аарон Нет, это не так. Это похоже на ввод новой строки непосредственно в пом. Кажется, что такие пробельные символы полностью урезаны. Единственный способ найти новые строки - это окружить их печатными символами, что действительно не полезно. – radlan

+0

Зачем вам это нужно? pathSeparator обычно является разделителем, который ОС использует для разделения пути. – Tunaki

ответ

0

В XML вы можете конкретный символ новой строки, используя следующий побег последовательность - &#x0A;

К сожалению, как вы уже упоминалось, значение <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> больше не определен в конфигурации вашей зависимости.

+0

Это не прискорбно, это по дизайну. Эта цель предназначена для создания чего-то полезного как classpath, а не общего причудливого списка. – Tunaki

+0

@ Tunaki Я понимаю, что решение приемлемо для вас, но выбор наречий не так ли? Что бы вы предпочли, я его сменил - * увы *, * несчастливо *, * к сожалению * или * к сожалению *? Поскольку вопрос был * Как я могу это сделать? *, А не * Почему я не могу это сделать? *, Я замалчивался, объясняя причину сосредоточиться на ответе. Результат раллана не связан с целью цели. Содержимое элемента в разделе '' обрезается по умолчанию, если не включен атрибут 'xml: space =" сохранить ". Спасибо, что предоставили мне возможность расшириться. – Frelling

+0

@Frelling Пока ваше предложение может работать, я пойду так, как описывает КрисНаурот. Но все равно спасибо за вашу помощь. – radlan

1

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 вместо баночка имена файлов. Возможно, это на самом деле более ценно, потому что выход не изменится на разных машинах, выполняющих сборку. (Файлы jar будут использовать абсолютные пути, которые могут быть разными на разных машинах.)

Если на самом деле это должны быть имена файлов jar вместо идентификаторов артефакта Maven, то вы могли бы сгребать что-то вместе, введя символ без пробелов в значение <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.

+0

Это не к сожалению, это по дизайну. Эта цель предназначена для создания чего-то полезного как classpath, а не общего причудливого списка. – Tunaki

+0

@Tunaki, спасибо. Я отредактировал его, чтобы удалить слово, которое вам не понравилось. –

+0

@ChrisNauroth Ну, это для документации, но все же мне нужны имена баннеров. Я думаю, что ваш подход к добавлению единственного подчеркивания - это решение, которое лучше всего подходит. Поэтому я принимаю ваш ответ. – radlan