【问题标题】:How to make IntelliJ IDEA recognize build-time generated sources?如何让 IntelliJ IDEA 识别构建时生成的源?
【发布时间】:2017-09-24 21:54:47
【问题描述】:

我发了small zip example 来说明问题。

我在项目中有来自 AutoValue example 的 Animal 类和一个 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>

【问题讨论】:

  • Maven 约定(由 IntelliJ 识别)会将生成的源代码放在 target/generated-sources/[plugin-name]
  • @Tome 那么谁将生成的java文件放入target/classes
  • 通常是进程/插件实际进行生成。在这里,com.google.auto.value:auto-value 是一个 APT 而不是外部插件,您可以在这里查看:immutables.github.io/apt.html
  • @Tome auto-value 不是插件。这是一个依赖。无论如何,将生成的内容放在target/classes 中的是maven。不是 IntelliJ。
  • 是的,它是一个注解处理器,编译器插件应该将生成的源代码放在`${project.build.directory}/generated-sources/annotations` 中(见maven.apache.org/plugins/maven-compiler-plugin/…

标签: maven intellij-idea compilation auto-generate auto-value


【解决方案1】:

似乎以下解决了这个问题:

<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.javatarget/generated-sources/annotations 中生成,IntelliJ IDEA 无需任何额外调整即可读取该文件。

我读到 Java 5 不支持注释处理(但生成了类)。查看更多信息here

【讨论】:

【解决方案2】:

找到了一个对我有用但不喜欢的解决方案。我从Excluded 中取消标记target 文件夹并将classes 标记为Sources

为了继续排除所有其他目标文件夹,我必须将所有其他文件夹标记为已排除。

这是一个不好的解决方案,因为:

  1. 如果你想保持你的代码在 dev-env 中干净,你没有提交 IDEA'a 配置文件。因此需要对每个克隆重复此步骤。
  2. 如果其他文件夹开始进入target 文件夹,您需要手动排除它们。
  3. 解决方案不是以 Maven 为中心,导致 dev-env 配置被拆分为多个文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 2017-08-02
    • 2015-05-31
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多