Как заставить IntelliJ IDEA распознавать источники, созданные во время сборки?

Я сделал небольшой zip-пример, чтобы проиллюстрировать проблему.

У меня есть в проекте класс Animal из примера AutoValue и файл maven pom для генерации и компиляции кода. Смотри ниже.

Запуск mvn clean install отлично работает, генерирует и компилирует все в target/classes:

введите здесь описание изображения

Проблема в том, что IntelliJ не распознает AutoValue_Animal:

введите здесь описание изображения

Итак, как заставить IntelliJ IDEA распознавать источники, созданные во время сборки?

* Желательно без необходимости изменять настройки IDEA, чтобы среда разработки была консолидирована вокруг Maven.

Класс:

package kilaka;

import com.google.auto.value.AutoValue;

@AutoValue
public abstract class Animal {
    static Animal create(String name, int numberOfLegs) {
        // See "How do I...?" below for nested classes.
        return new AutoValue_Animal(name, numberOfLegs);
    }

    abstract String name();

    abstract int numberOfLegs();
}

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>kilaka</groupId>
    <artifactId>auto-test</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>com.google.auto.value</groupId>
            <artifactId>auto-value</artifactId>
            <version>1.2</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
</project>

person AlikElzin-kilaka    schedule 27.04.2017    source источник
comment
Соглашения Maven (признанные IntelliJ) помещают сгенерированные источники в target/generated-sources/[plugin-name].   -  person Tome    schedule 27.04.2017
comment
@Tome Итак, кто помещает сгенерированный файл Java в target/classes?   -  person AlikElzin-kilaka    schedule 27.04.2017
comment
Обычно это процесс/плагин, фактически выполняющий генерацию. Здесь, поскольку com.google.auto.value:auto-value — это скорее APT, чем внешний плагин, вы можете посмотреть здесь: immutables.github .io/apt.html   -  person Tome    schedule 27.04.2017
comment
@Tome auto-value не является плагином. Это зависимость. Во всяком случае, именно maven помещает сгенерированный контент в target/classes. Не IntelliJ.   -  person AlikElzin-kilaka    schedule 27.04.2017
comment
Да, это скорее обработчик аннотаций, и плагин компилятора должен помещать сгенерированные исходники в `${project.build.directory}/generated-sources/annotations` (см. maven.apache.org/plugins/maven-compiler-plugin/)   -  person Tome    schedule 27.04.2017
comment
@Tome с помощью generatedSourcesDirectory решил проблему. Спасибо. Вы хотите добавить ответ или я?   -  person AlikElzin-kilaka    schedule 27.04.2017
comment
Продолжайте с ответом, рад, что это помогло.   -  person Tome    schedule 27.04.2017
comment
Похоже, что в конечном итоге исправление заключалось в использовании тега source в maven-compiler-plugin. Неважно, является ли источник 5 или 8.   -  person AlikElzin-kilaka    schedule 27.04.2017
comment
Включите обработку аннотаций в настройках Intellij, чтобы во время сборки код компилировался и выполнялся тест.   -  person swapnil    schedule 13.07.2017


Ответы (2)


Нашел решение, которое сработало для меня, но не нравится. Я снял пометку с папки target с папки Excluded и пометил папку classes как Sources.

Чтобы продолжать исключать все другие целевые папки, мне пришлось пометить все остальные папки как исключенные.

введите здесь описание изображения

Это плохое решение, потому что:

  1. Если вы хотите защитить свой код от dev-env, вы не фиксируете файлы конфигурации IDEA. Таким образом, необходимо повторить этот шаг на каждом клоне.
  2. Если в папку target начинают попадать дополнительные папки, их нужно исключить вручную.
  3. Решение не ориентировано на maven, в результате чего конфигурация dev-env разбивается на несколько файлов.
person AlikElzin-kilaka    schedule 27.04.2017

Кажется, что следующее решает проблему:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.5</version>
    <configuration>
        <source>6</source>
        <target>6</target>
    </configuration>
</plugin>

Это привело к тому, что файл AutoValue_Animal.java был сгенерирован в target/generated-sources/annotations, который IntelliJ IDEA прочитал без дополнительной настройки.

Я читал, что обработка аннотаций не поддерживалась в Java 5 (тем не менее, класс был сгенерирован). Дополнительную информацию см. здесь.

person AlikElzin-kilaka    schedule 27.04.2017
comment
См. объяснение в github.com/google/auto/issues/482#issuecomment-297711192. - person Thomas Broyer; 27.04.2017
comment
"Я читал, что обработка аннотаций не поддерживалась в Java 5 (хотя класс был сгенерирован)" Поскольку вы не используете Java 5, вы (вероятно) используете Java 7 или 8 и сообщаете его для кросс-компиляции для среды выполнения, совместимой с Java 5 (docs.oracle.com/javase/8/docs/technotes/tools/unix/); это не то же самое! И помните, что это может сломаться во время выполнения, если вы не передаете -bootclasspath: cloudbees. .com/blog/beware-sirens-target-call - person Thomas Broyer; 27.04.2017