我试图在一个项目中使用Spring Security,我使用eclipselink作为modelgen处理器来生成静态元模型。 当我尝试这样做时,我得到奇怪的编译错误,如:
> java.lang.RuntimeException: com.sun.tools.javac.code.Symbol$CompletionFailure: class file for org.springframework.security.ldap.DefaultSpringSecurityContextSource not found
即使我不使用LDAP。如果我添加罐子,我会得到其他错误,比如缺少sl4j,缺少openid等等。 如果我用hibernate实现交换使用过的modelgen处理器,一切都会编译没有问题。
我发现了一个重现问题的最小项目:
MyEnity.java
@Entity
public class MyEntity {
private String name;
private Long id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
SecurityConfig.java
public class SecurityConfig extends WebSecurityConfigurerAdapter {
}
的build.gradle
apply plugin: 'war'
apply plugin: 'maven'
group = 'com.demo'
version = 'alpha'
sourceCompatibility = 1.8
targetCompatibility = 1.8
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
repositories {
maven { url "http://repo.maven.apache.org/maven2" }
maven { url "http://download.eclipse.org/rt/eclipselink/maven.repo/" }
}
dependencies {
compile 'org.eclipse.persistence:org.eclipse.persistence.jpa.modelgen.processor:2.6.0'//latest stable @06.07.2015
compile "org.springframework:spring-beans:4.1.6.RELEASE"
compile "org.springframework:spring-core:4.1.6.RELEASE"
compile "org.springframework:spring-web:4.1.6.RELEASE"
compile "org.springframework:spring-context:4.1.6.RELEASE"
compile 'org.springframework:spring-jdbc:4.1.6.RELEASE'
compile 'org.springframework.security:spring-security-core:4.0.2.RELEASE'
compile 'org.springframework.security:spring-security-web:4.0.2.RELEASE'
compile 'org.springframework.security:spring-security-config:4.0.2.RELEASE'
providedCompile 'javax:javaee-api:7.0@jar'
}
一旦我删除
a)来自MyEntity的@Entity
或
b)从Security Config
扩展WebSecurityConfigurerAdapter或
c)使用compile 'org.hibernate:hibernate-jpamodelgen:4.3.10.Final'
而不是compile 'org.eclipse.persistence:org.eclipse.persistence.jpa.modelgen.processor:2.6.0'
一切都没有问题。
那么为什么使用eclipselink modelgen处理器会导致编译错误?
答案 0 :(得分:0)
问题是EclipseLink modelgen的CanonicalModelProcessor
,即使使用版本2.7.4也是如此。它作为Java Agent的工作方式来处理类路径上的所有类。在某个时候,它命中了Spring Security类(例如HttpSecurity
),它间接依赖于类路径中找不到的库(通常是内部类或工厂返回类型,因为Spring设计得很好, OpenIDLoginConfigurer
由HttpSecurity.openidLogin()
返回,并引用了OpenIDAttribute
等),这时整个代理崩溃,而不是跳过类型。
问题不是特定于Spring或Spring Security,而是任何使用类路径上缺少可选依赖项的项目!
令人惊讶的是,它似乎可以在OpenJDK 11上运行,但不能在OpenJDK 8上运行。从我的角度来看,CanonicalModelProcessor
有问题。最后,我将生成的元模型添加到我们的项目仓库中,并暂时删除了modelgen。
更新:我知道这不是真正的答案(如果您不能使用OpenJDK 11),但至少我想弄清楚这是EclipseLink的一个错误,没有解决方法(据我所知)。