标签: annotation-processing

如何生成JPA 2.0元模型?

本着与CriteriaQuery相关的类型安全的精神,JPA 2.0还有一个API来支持实体的Metamodel表示.

是否有人知道这个API的全功能实现(生成Metamodel而不是手动创建元模型类)?如果有人也知道在Eclipse中设置它的步骤,那将是非常棒的(我假设它就像设置注释处理器一样简单,但你永远不知道).

编辑:偶然发现了Hibernate JPA 2 Metamodel Generator.但问题仍然存在,因为我找不到jar的任何下载链接.

编辑2:少顷已经过去了,因为我问过这个问题,但我想我会回来,并添加一个链接到SourceForge上的Hibernate JPA模型生成项目

java jpa annotation-processing metamodel jpa-2.0

89
推荐指数
6
解决办法
10万
查看次数

Java 6注释处理 - 从注释中获取类

我有一个名为@Pojo的自定义注释,我用它来生成自动维基文档:

package com.example.annotations;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.METHOD)
public @interface Pojo {
    Class<?> value();
}
Run Code Online (Sandbox Code Playgroud)

我这样使用它:

@Pojo(com.example.restserver.model.appointment.Appointment.class)
Run Code Online (Sandbox Code Playgroud)

注释资源方法,以便注释处理器可以自动生成描述其期望的资源和类型的Wiki页面.

我需要value在注释处理器中读取字段的值,但我收到运行时错误.

在我的处理器的源代码中,我有以下几行:

final Pojo pojo = element.getAnnotation(Pojo.class);
// ...
final Class<?> pojoJavaClass = pojo.value();
Run Code Online (Sandbox Code Playgroud)

但实际的类不适用于处理器.我想我需要一个javax.lang.model.type.TypeMirror代替真正的班级的代理人.我不确定如何获得一个.

我得到的错误是:

javax.lang.model.type.MirroredTypeException: Attempt to access Class object for TypeMirror com.example.restserver.model.appointment.Appointment
Run Code Online (Sandbox Code Playgroud)

Appointment是我的一个@Pojo注释中提到的类.

不幸的是,关于Java注释处理的文档和/或教程似乎很少.尝试使用谷歌搜索.

java types annotation-processing

45
推荐指数
2
解决办法
1万
查看次数

如何为java注释处理器编写自动化单元测试?

我正在尝试使用java注释处理器.我能够使用"JavaCompiler"编写集成测试(事实上我现在正在使用"hickory").我可以运行编译过程并分析输出.问题:即使我的注释处理器中没有任何代码,单个测试也会运行大约半秒钟.这在TDD风格中使用它太长了.

嘲笑依赖关系对我来说似乎很难(我必须模拟整个"javax.lang.model.element"包).有人成功为注释处理器(Java 6)编写单元测试吗?如果不是......你的方法是什么?

java unit-testing annotations annotation-processing

26
推荐指数
3
解决办法
6326
查看次数

Maven 3 - 如何添加注释处理器依赖?

我需要在项目的源代码上运行注释处理器.注释处理器不应该成为项目的传递依赖项,因为它只需要注释处理而不需要其他内容.

这是我用于此的完整(非工作)测试pom:

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>test</groupId>
  <artifactId>test</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>Test annotations</name>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <hibernate-jpamodelgen.version>1.2.0.Final</hibernate-jpamodelgen.version>
  </properties>
  <dependencies>
    <dependency>
      <groupId>javax</groupId>
      <artifactId>javaee-api</artifactId>
      <version>6.0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.0</version>
        <configuration>
          <annotationProcessors>
            <annotationProcessor>
              org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor</annotationProcessor>
          </annotationProcessors>
          <debug>true</debug>
          <optimize>true</optimize>
          <source>1.6</source>
          <target>1.6</target>
          <compilerArguments>
            <AaddGeneratedAnnotation>true</AaddGeneratedAnnotation>
            <Adebug>true</Adebug>
          </compilerArguments>
        </configuration>
        <dependencies>
          <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-jpamodelgen</artifactId>
            <version>${hibernate-jpamodelgen.version}</version>
          </dependency>
        </dependencies>
      </plugin>
    </plugins>
  </build>
</project>
Run Code Online (Sandbox Code Playgroud)

org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor在测试的插件配置中明确定义为注释处理器,我知道它不应该是必需的.

我遇到的问题是hibernate-jpamodelgen依赖项没有添加到编译器类路径中,因此找不到注释处理器并且构建失败.

根据这个答案,我尝试将依赖项添加为构建扩展(不确定我理解那些应该是什么!),如下所示:

<extensions>
  <extension>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-jpamodelgen</artifactId>
    <version>${hibernate-jpamodelgen.version}</version>
  </extension>
</extensions>
Run Code Online (Sandbox Code Playgroud)

这也不会添加hibernate-jpamodelgen到编译器类路径中.

到目前为止,我发现唯一可行的方法是在该<dependencies>部分中将依赖项添加到项目中.这有一个令人遗憾的副作用,hibernate-jpamodelgen …

java maven-3 maven annotation-processing jpa-2.0

25
推荐指数
4
解决办法
4万
查看次数

是否可以将Lombok与Kotlin一起使用?

我有一个Kotlin Gradle项目.我添加了龙目岛作为依赖,并用kapt注册了它

compileOnly("org.projectlombok:lombok:$lombokVersion")
kapt("org.projectlombok:lombok:$lombokVersion")
Run Code Online (Sandbox Code Playgroud)

我想只使用@Slf4janotation进行自动log生成.它适用于Java类,但不适用于Kotlin类.

到目前为止,甚至可以将Kotling和Lombok一起使用?

编辑:添加更多细节

如果我用一个Kotlin类注释@Slf4jlog在其中使用我得到

未解决的参考:日志

显然没有应用注释处理.

java annotation-processing lombok kotlin

25
推荐指数
3
解决办法
1万
查看次数

如何在Gradle中将生成的源文件夹添加到源路径?

我使用注释处理.因此我使用apt插件.它生成新的Java源代码build/source/apt.

这是我的build.gradle:

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'apt'
apply plugin: 'war'
apply plugin: 'gwt'
apply plugin: 'jetty'

sourceCompatibility = 1.7
version = '1.0'

eclipse {
    classpath {
       downloadSources=true
       downloadJavadoc=true
    }
}

buildscript {
    repositories {
        mavenCentral()
        jcenter()
        maven {
            url "https://oss.sonatype.org/content/repositories/snapshots/"
        }
    }
    dependencies {
        classpath 'de.richsource.gradle.plugins:gwt-gradle-plugin:0.6'      
        classpath 'com.jimdo.gradle:gradle-apt-plugin:0.5-SNAPSHOT'
    }
}

repositories {
    mavenCentral()
    maven {
        name = "sonatype"
        url = "https://oss.sonatype.org/content/repositories/snapshots/"
    }
}

dependencies {
    apt 'com.google.dagger:dagger-compiler:2.0-SNAPSHOT:jar-with-dependencies'

    compile 'com.google.guava:guava:18.0'
    compile 'com.google.guava:guava-gwt:18.0'
    compile …
Run Code Online (Sandbox Code Playgroud)

java eclipse android gradle annotation-processing

24
推荐指数
6
解决办法
2万
查看次数

注释处理器生成的错误/警告未在Eclipse编辑器或"问题"视图中显示

我编写了一个客户注释处理器来生成包含在Eclipse插件中的各种源文件.作为此过程的一部分,它还使用通常的调用记录各种错误和警告ProcessingEnvironment#getMessager().printMesssage(Kind, String, Element).

我一直在通过调试Eclipse中的插件来测试处理器.在Eclipse的已启动子实例中,处理器都按预期工作 - 源文件由编译器根据需要生成,拾取和解释.生成和未生成的任何编译器(即非自定义)错误都会出现在编辑器,问题视图等中,如预期的那样.

但是,我发现自定义错误和警告的显示方式存在很多不一致之处.我看到的行为如下:

  1. 如果未指定Element,则所有消息都将显示在Info类型下的Error Log中,而不管记录错误时指定的Kind是什么.
  2. 如果消息是Kind类型,NOTE它始终显示在Info类型下的Error Log中,无论是否指定了Element.
  3. 否则,如果指定了元素,则会在"问题"视图和编辑器中间歇性地显示错误和警告; 有时它们不会出现在任何地方.它们永远不会出现在错误日志中,无论是Kind ERROR还是WARNING

根据上面的重点,真正的问题是第3项 - 在某些情况下,尽管登录了有效元素,我仍然无法在编辑器中出现错误.实际上,我已经成功地通过简单地更改特定生成的源文件的名称来可靠地显示错误而不会出现.

当然问题不在于文件名本身,但肯定的情况是,生成一个名称与代码中已经存在的引用相匹配的类会导致错误被隐藏,同时使用不同的名称生成错误(或根本不生成错误)会导致错误显示(以及由缺少的类引起的所有常规编译器错误).最奇怪的是,与其他任何类(其中有许多类)相比,这个生成的类没有任何根本的不同,尽管它的结构和引用方式都是独一无二的.它也相当长(约400种方法),但人为地缩短它没有任何区别.其他生成的类在代码中也有现有引用,并且不会抑制错误.

不幸的是,我还没有时间测试是否在部署Eclipse插件时(即在Eclipse的"真实"实例中运行)发生此问题,或者实际上如果在javac显式调用或调用Maven构建时出现问题.

如果没有发布插件的完整代码,我不希望任何人能够直接提供帮助,但如果任何人遇到注释处理器生成的错误的经验问题,我对任何建议或建议都非常开放.在我看来,这似乎是Eclipse中的一个错误,但我无法在线找到它的任何引用.我也无法在底层Eclipse实例或Eclipse的已启动子实例的.metadata/.log文件中找到任何错误.最后,我确保在注释处理器代码中没有抑制或报告异常.

Eclipse版本详细信息:

Version: Luna Service Release 1a (4.4.1)
Build id: 20150109-0600
Run Code Online (Sandbox Code Playgroud)

任何帮助表示感谢,并提前多多感谢:)

java eclipse eclipse-plugin annotation-processing

24
推荐指数
1
解决办法
840
查看次数

指定注释处理器的顺序

我正在尝试在我的Java项目上运行Dagger 2和Lombok.当然,龙目岛必须首先运行,但实际上它是否真的有机会.起初我怀疑我可以通过类路径中库jar的相应位置来指定顺序,但是该顺序显然会被忽略.

有没有办法指定它们以某种方式运行的顺序,或者我只是不得不忍受不能组合两个AP?

我制作了一个SSCCE测试用例.

一个简单的git clone&mvn compile足以证明这个问题 - 如果您在App.java中注释第18行并取消注释第20-21行,它将进行编译,即使第18行中的Lombok表示法创建了相同的构造函数.问题是龙目岛似乎追随Dagger.

java annotation-processing lombok dagger

24
推荐指数
3
解决办法
6011
查看次数

转发兼容的Java 6注释处理器和SupportedSourceVersion

我正在为一个项目尝试Java 7并从这种注释处理器(Bindgen和Hibernate JPA modelgen)获得警告:

warning: Supported source version 'RELEASE_6' from annotation processor 'org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor' less than -source '1.7'
Run Code Online (Sandbox Code Playgroud)

这是由@SupportedSourceVersion(SourceVersion.RELEASE_6)注释处理器类上的注释引起的.由于它们是使用Java 6编译的,因此SourceVersion可用的最高值是RELEASE_6.Java 7版本SourceVersion介绍RELEASE_7.

我的问题:注释处理器如何处理前向兼容性?是否必须有单独的jdk6和jdk7二进制版本?我在这里不理解其他什么吗?

我只发现了有关此问题的以下信息:

Querdydsl bug报告其使用

@Override
public SourceVersion getSupportedSourceVersion() {
    return SourceVersion.latest();
}
Run Code Online (Sandbox Code Playgroud)

评论员建议支持最新源版本的Oracle博客

java annotations annotation-processing java-6 java-7

22
推荐指数
1
解决办法
7069
查看次数

Gradle弃用了lombok的注释处理器警告

升级到gradle 4.7后,我之前的无警告版本现在会发出此警告:

在编译类路径上检测到以下注释处理器:'lombok.launch.AnnotationProcessorHider $ AnnotationProcessor'和'lombok.launch.AnnotationProcessorHider $ ClaimingProcessor'.不推荐在编译类路径上检测注释处理器,Gradle 5.0将忽略它们.请将它们添加到注释处理器路径中.如果您不打算使用注释处理器,则可以使用'-proc:none'编译器参数来忽略它们.

似乎不推荐使用注释处理器,并且gradle版本5.0不支持注释处理器.

我的项目使用lombok,它需要处理注释处理器,因此使用-proc:none不是一种选择.当verison 5.0发布时,它们都不会停止使用Gradle.

我如何能:

  • 停止警告,并且
  • 确保我的项目将继续使用未来的Gradle版本构建?

java warnings gradle annotation-processing lombok

21
推荐指数
3
解决办法
1万
查看次数