我试图在一个项目中使用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。如果我添加jar我会得到其他错误,比如缺少sl4j,缺少openid等等。如果我用hibernate实现交换使用过的modelgen处理器,所有编译都没有问题。
我找到了一个重现问题的最小项目:
my E你讨厌.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;
}
}
security config.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处理器会导致编译错误呢?
问题是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的一个错误,没有解决方法(据我所知)。