Требуется файл из src / main / resources на этапе создания источников для конфигурации процессора аннотаций

У меня есть процессор аннотаций, который мне нужно настроить, чтобы сообщить ему несколько деталей о том, как я хочу, чтобы он генерировал исходный код. Я потратил много времени, пытаясь понять, почему файл находится в 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 клиентского проекта).

Как мне поступить:

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

Я бы предпочел не писать для этого целый плагин 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>

person StormeHawke    schedule 03.09.2014    source источник
comment
Покажи pom файл, иначе сложно угадать, что не так?   -  person khmarbaise    schedule 03.09.2014
comment
См. Правки, добавленные соответствующие части pom.xml и некоторую другую документацию.   -  person StormeHawke    schedule 03.09.2014
comment
Если я правильно понимаю ваш запрос, у вас есть часть, которая создается, а другая часть создается как обычно. В таких случаях вы должны создать отдельный модуль с вашим сгенерированным кодом и второй модуль, который содержит обычную часть. Следствием этого является создание многомодульной сборки. Это облегчает жизнь. Кроме того, почему вы добавляете вещи, которые уже используются по умолчанию, например папку src/main/resources? src/main/webapp никогда не должны быть частью ресурсов, поэтому у вас есть военный пакет в сочетании с несколькими другими вещами. Вы нарушаете разделение интересов.   -  person khmarbaise    schedule 04.09.2014
comment
Как объясняется в вопросе, этап генерации кода (generate-sources) наступает перед копированием ресурсов (process-resources). Мне нужен ресурс на generate-sources этапе maven.apache.org/ ref / 3.2.2 / maven-core / lifecycles.html   -  person StormeHawke    schedule 04.09.2014
comment
Если ресурс только копируется (а не создается и не изменяется), не могли бы вы просто получить к нему доступ прямо в src/main/resources/config? Обработчик аннотаций должен иметь доступ к ресурсам через свой Filer.   -  person kapex    schedule 08.09.2014


Ответы (1)


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

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

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

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

person StormeHawke    schedule 08.09.2014