У меня есть процессор аннотаций, который мне нужно настроить, чтобы сообщить ему несколько деталей о том, как я хочу, чтобы он генерировал исходный код. Я потратил много времени, пытаясь понять, почему файл находится в target / classes после сборки, но во время обработки аннотации я получал исключение, в котором говорилось, что файл на самом деле не существует.
После долгих поисков я наконец понял, почему файл (хранящийся в 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, если это возможно.
Изменить: Вот соответствующие части <build>
части моего клиентского pom для каждого запроса:
<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>
src/main/resources
?src/main/webapp
никогда не должны быть частью ресурсов, поэтому у вас есть военный пакет в сочетании с несколькими другими вещами. Вы нарушаете разделение интересов. - person khmarbaise   schedule 04.09.2014generate-sources
) наступает перед копированием ресурсов (process-resources
). Мне нужен ресурс наgenerate-sources
этапе maven.apache.org/ ref / 3.2.2 / maven-core / lifecycles.html - person StormeHawke   schedule 04.09.2014src/main/resources/config
? Обработчик аннотаций должен иметь доступ к ресурсам через свой Filer. - person kapex   schedule 08.09.2014