У меня есть обработчик аннотации, который мне нужно дать некоторой конфигурации, чтобы рассказать ему несколько деталей о том, как я хочу, чтобы он генерировал исходный код. Я потратил много времени, пытаясь понять, почему файл сидел в 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 проекта клиента).
Как я могу идти о как:
- Получение (как минимум) в config.xml часть процесса-ресурсов произойти, прежде чем генерировать-источники
- Добавление файла в путь к классам аннотацию процессором каким-то другим способом (нам не нужен этот файл в выходном архиве, поэтому это может быть лучше)
- Я также открыт для других (чистых) способов получения информации о конфигурации в обработчик аннотации, если есть лучший способ, о котором я не думал
Я бы предпочел не писать весь плагин 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>
Покажите вам файл pom, иначе трудно догадаться, что происходит не так? – khmarbaise
См. Правки, добавлены соответствующие части pom.xml и некоторая другая документация. – StormeHawke
Если я понимаю ваш запрос правильно, у вас есть часть, которая сгенерирована, и другая часть, которая создается как обычно. В таких случаях вы должны создать отдельный модуль с вашим сгенерированным кодом и вторым модулем, который содержит обычную часть. Следствием этого является создание многострочной сборки. Это облегчает жизнь.Кроме того, почему вы добавляете вещи, которые по умолчанию являются папками 'src/main/resources'? 'src/main/webapp' никогда не должен быть частью ресурсов, поэтому у вас есть военная упаковка в сочетании с несколькими другими вещами. Вы нарушаете разделение проблем. – khmarbaise