2015-08-24 4 views
1

В тестах, когда я установил полный путь к pom.xml, все работает отлично:Maven распознаватель из pom.xml, Shrinkwrap

{code} 
File[] files = Maven.resolver().loadPomFromFile("/full/system/path/pom.xml").importDependencies(ScopeType.TEST, ScopeType.PROVIDED).resolve().withTransitivity().asFile(); 
{code} 

Во многих примерах используется только pom.xml, так что я пробовал:

{code} 
File[] files = Maven.resolver().loadPomFromFile("pom.xml").importDependencies(ScopeType.TEST, ScopeType.PROVIDED).resolve().withTransitivity().asFile(); 
{code} 

Но в этом случае я получаю исключение:

Path to the pom.xml file must be defined and accessible 

Тот же результат, если я стараюсь передать «» ../pom.xml»Я должен включать в себя все dependencie. s от pom.xml в военный архив, который развернут во время аркиллианских тестов, есть ли обходной путь? В идеале я хотел бы повторно использовать pom.xml, который используется для создания проекта. Я не хочу иметь отдельный файл pom.xml в папке «src/test/resources».

EDIT: У меня есть основная идея @baba, но вместо того, чтобы справиться pom.xml, я установил basedir свойство с помощью фильтрации Maven ресурсов:

Я добавил файл tests.properties в test/resources, добавил свойство в файле:

basedir=${basedir} 

В pom.xml я использовал [http://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html]

<build> 
    <testResources> 
     <testResource> 
      <directory>src/test/resources</directory> 
      <filtering>true</filtering> 
     </testResource> 
    </testResources> 

В тестах, я загрузила все зависимости:

ResourceBundle resourceBundle = ResourceBundle.getBundle ("tests"); 
String baseDir = resourceBundle.getString("basedir"); 
File[] files = Maven.resolver().loadPomFromFile(baseDir + File.separator + "pom.xml").importDependencies(ScopeType.TEST, ScopeType.PROVIDED).resolve().withTransitivity().asFile(); 
+0

Вы работаете в Linux? – AndrewSmiley

+0

@AndrewSmiley, да, я. – Alexandr

+0

@ Александр это еще лучше. –

ответ

2

Вы должны понять одну вещь, а затем две другие вещи. Вот первая вещь:

  1. Как только вы говорите о относительных путях в банке и не fullpaths, вы говорите (в основном) о пути к классам файлов. Таким образом, вы, вероятно, следует обратить внимание на LoadPomTask, который имеет метод

общественности статической LoadPomTask loadPomFromClassLoaderResource (конечная строка pathToPomResource)

Теперь, когда мы поняли, что нет никакого способа, чтобы избежать пути к классам , мы должны ответить на два других вопроса:

  1. Файл pom.xml, связанный по пути класса по умолчанию (ответ: да) (где? по умолчанию->META-INF/maven/${groupId}/${artifactId}/pom.xml)
  2. Если я использую тестовую инфраструктуру, например surefire, она меняет путь к классам и является pom.xml доступным в том же месте во время выполнения тестов (ответ: да, в основном)

Предлагаемое решение: Поскольку META-iNF/MAVEN/${groupId}/${artifactId} может быть изменено, вы не должны иметь ссылок в коде, который загружает материал оттуда. Поэтому я предлагаю вам взглянуть на maven-resources-plugin. Который позволил вам скопировать pom.XML-файл во время компиляции на месте по вашему выбору (я на самом деле рекомендую скопировать его в двух местах:

/src/main/resources 

и

/src/test/resources 

В process-resources и process-test-resources фаз соответственно: see maven-build-lifecycles

Подводя итог:

  1. Вам нужно загрузить pom.xml из пути к классам, если вы хотите использовать местоположение типа (pom.xml), а не полный путь

  2. Вам нужно включить файл pom.xml во время компиляции фаза, используя maven-resources-plugin, чтобы быть в вашем пути к классу

Смежные вопросы