2014-09-03 4 views
2

У меня есть обработчик аннотации, который мне нужно дать некоторой конфигурации, чтобы рассказать ему несколько деталей о том, как я хочу, чтобы он генерировал исходный код. Я потратил много времени, пытаясь понять, почему файл сидел в target/classes после сборки, но я получал исключение во время обработки аннотаций, заявляя, что файл фактически не существует.Нужен файл из src/main/resources в фазе генерации источников для конфигурации процессора аннотаций

После долгого рытья я, наконец, понял, почему файл (хранится в src/main/resources/config) не получает копируюсь в target/classes/config для моего процессора аннотаций читать - generate-sources происходит до process-resources жизненного цикла сборки, поэтому файл не получает скопированный вовремя, чтобы обработчик аннотации увидел его во время его запуска. (Maven ссылка сборки Жизненный цикл: http://maven.apache.org/ref/3.2.2/maven-core/lifecycles.html)

Вот краткий обзор того, что я пытаюсь сделать:

У меня есть баночка, что я построил, который обрабатывает аннотаций и генерирует классы интерфейса из информации в аннотации для создания клиента api. Идея состоит в том, что включение этой jar в зависимость от времени компиляции должно автоматически генерировать этот код для любого проекта, который использует эти аннотации (с минимальной возможной дополнительной конфигурацией в pom.xml проекта клиента).

Как я могу идти о как:

  1. Получение (как минимум) в config.xml часть процесса-ресурсов произойти, прежде чем генерировать-источники
  2. Добавление файла в путь к классам аннотацию процессором каким-то другим способом (нам не нужен этот файл в выходном архиве, поэтому это может быть лучше)
  3. Я также открыт для других (чистых) способов получения информации о конфигурации в обработчик аннотации, если есть лучший способ, о котором я не думал

Я бы предпочел не писать весь плагин maven для этого, если это возможно.

Edit: Вот соответствующие части <build> части моего клиента ПОМ на заказ:

<build> 
    <finalName>OurApp</finalName> 
    <resources> 
     <resource> 
      <!-- My config.xml file is located here --> 
      <directory>src/main/resources</directory> 
     </resource> 
     <resource> 
      <directory>src/main/webapp</directory> 
      <includes> 
       <include>*.*</include> 
      </includes> 
      <excludes><exclude>${project.build.directory}/generated-sources/**</exclude></excludes> 
     </resource> 
    </resources> 
    <plugins> 
     <!-- Omit Annotation Processor lib from the compilation phase because the code generated is destined for another, separate jar --> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>${maven-compiler-plugin.version}</version> 
      <executions> 
       <execution> 
       <id>annotation-processing</id> 
       <phase>generate-sources</phase> 
       <goals> 
        <goal>compile</goal> 
       </goals> 
       <configuration> 
        <proc>only</proc> 
       </configuration> 
       </execution> 
       <!-- Compile the rest of the code in the normal compile phase --> 
       <execution> 
       <id>compile-without-generated-source</id> 
       <phase>compile</phase> 
       <goals> 
        <goal>compile</goal> 
       </goals> 
       <configuration> 
        <excludes><exclude>${project.build.directory}/generated-sources/**</exclude></excludes> 
        <proc>none</proc> 
        <!-- http://jira.codehaus.org/browse/MCOMPILER-230 because this doesn't 
         work in the opposite direction (setting failOnError in the other execution 
         and leaving the default top-level value alone) --> 
        <failOnError>true</failOnError> 
       </configuration> 
       </execution> 
      </executions> 
      <configuration> 
       <source>${java.version}</source> 
       <target>${java.version}</target> 
       <proc>only</proc> 
       <failOnError>false</failOnError> 
      </configuration> 
     </plugin> 
     <!-- package generated client into its own SOURCE jar --> 
     <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <version>2.4.1</version> 
      <configuration> 
       <descriptorRefs> 
        <descriptorRef>generated-client-source</descriptorRef> 
       </descriptorRefs> 
      </configuration> 
      <dependencies> 
       <dependency> 
        <groupId>com.package</groupId> 
        <artifactId>our-api</artifactId> 
        <version>${our-api.version}</version> 
       </dependency> 
      </dependencies> 
      <executions> 
       <execution> 
        <id>client-source</id> 
        <phase>package</phase> 
        <goals> 
         <goal>single</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 
+0

Покажите вам файл pom, иначе трудно догадаться, что происходит не так? – khmarbaise

+0

См. Правки, добавлены соответствующие части pom.xml и некоторая другая документация. – StormeHawke

+0

Если я понимаю ваш запрос правильно, у вас есть часть, которая сгенерирована, и другая часть, которая создается как обычно. В таких случаях вы должны создать отдельный модуль с вашим сгенерированным кодом и вторым модулем, который содержит обычную часть. Следствием этого является создание многострочной сборки. Это облегчает жизнь.Кроме того, почему вы добавляете вещи, которые по умолчанию являются папками 'src/main/resources'? 'src/main/webapp' никогда не должен быть частью ресурсов, поэтому у вас есть военная упаковка в сочетании с несколькими другими вещами. Вы нарушаете разделение проблем. – khmarbaise

ответ

1

Так, так как этот файл требуется только во время компиляции, и так как любая попытка нарисовать его прямо из classpath было неудачно, я решил перевернуть его в корне проекта и добавить аргумент компилятора в Maven, чтобы указать на файл.

<compilerArgs> 
     <compilerArg>-AconfigFilePath=${project.basedir}/config.xml</compilerArg> 
    </compilerArgs> 

Не совсем так элегантно, как получить его путь к классу автоматически, но все же лучше, чем поставлять все элементы конфигурации в виде отдельных свойств.

Спасибо за предложения

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

  • Нет связанных вопросов^_^