我跟着these steps on JetBrain's site创建了一个Web应用程序并让GlassFish在本地运行。它运行正常,我可以在JSP的项目的src树中嵌入代码输出,并在Web浏览器中查看它。当我添加Maven依赖项时,问题就开始了。我添加了
<dependency>
<groupId>com.nimbusds</groupId>
<artifactId>oauth2-oidc-sdk</artifactId>
<version>4.9</version>
</dependency>
到我的pom.xml并在我的代码中使用依赖项。 Maven安装依赖项,一切都很好,但当我点击绿色箭头在GlassFish中运行它时,我在浏览器打开时出现此错误:
org.apache.jasper.JasperException:PWC6033:JSP的Javac编译出错
PWC6199:生成的servlet错误: 源值1.5已过时,将在以后的版本中删除
PWC6199:生成的servlet错误: 目标值1.5已过时,将在以后的版本中删除
PWC6199:生成的servlet错误: 要禁止显示有关过时选项的警告,请使用-Xlint:-options。
PWC6197:jsp文件中的第8行:/index.jsp发生错误 PWC6199:生成的servlet错误: 无法访问com.nimbusds.oauth2.sdk.SerializeException 未找到com.nimbusds.oauth2.sdk.SerializeException的类文件
这里是index.jsp的来源:
<%@ page import="com.idsrvjpoc.IdentityServerConfiguration" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Redirect</title>
</head>
<body>
<% String redirectUrl = new IdentityServerConfiguration().getRedirectUrl(); %>
<a href="<%=redirectUrl%>"><%=redirectUrl%></a>
</body>
</html>
在我的模块的Java编译器设置中,目标字节码版本设置为1.8,我使用最新版本的1.8 JDK。
我发现另一个SO答案建议复制依赖关系&#39; JAR文件到glassfish4 \ glassfish \ domains \ domain1 \ lib文件夹,所以我试过了,它改变了错误:
java.lang.NoClassDefFoundError:com / nimbusds / oauth2 / sdk / id / ClientID
没有找到过时的目标值或类文件,而是NoClassDefFoundError。现在它是一个不同的班级。 SerializeException和ClientID都在同一个JAR中,我可以提取JAR并查看我认为正确位置的.class文件。
这里是IdentityServerConfiguration.java的来源:
package com.idsrvjpoc;
import com.nimbusds.oauth2.sdk.*;
import com.nimbusds.oauth2.sdk.id.*;
import java.net.URI;
import java.net.URISyntaxException;
public class IdentityServerConfiguration {
public String getRedirectUrl() throws URISyntaxException, SerializeException {
URI authzEndpoint = new URI("myAuthEndpoint");
ClientID clientID = new ClientID("1234");
Scope scope = new Scope("openid");
URI callback = new URI("http://localhost:8080/IdentityServerPoc_war_exploded/return.jsp");
State state = new State();
AuthorizationRequest request = new AuthorizationRequest.Builder(
new ResponseType(ResponseType.Value.CODE), clientID).
scope(scope).
state(state).
redirectionURI(callback).
endpointURI(authzEndpoint).
build();
return request.toURI().toString();
}
}
我错过了什么?
E:我刚尝试从GlassFish lib文件夹中删除JAR并编辑war工件,在Output Layout选项卡上我将jar从Available Elements移动到WEB-INF / lib目录,我看到它们被复制了在我建立时,但仍然是同样的错误。
我还尝试让工件将JAR中的.class文件解压缩到WEB-INF / classes文件夹中。再次,我在项目的out文件夹中的WEB-INF / classes文件夹中看到它们,但仍然是相同的java.lang.NoClassDefFoundError: com/nimbusds/oauth2/sdk/id/ClientID
E2:这是完整的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>IdSrvJPoc</groupId>
<artifactId>IdentityServerJavaPoc</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.nimbusds</groupId>
<artifactId>oauth2-oidc-sdk</artifactId>
<version>4.9</version>
</dependency>
</dependencies>
</project>
答案 0 :(得分:2)
由于您收到NoClassDefFoundError,因此您的lib文件夹中可能仍会缺少依赖项。确保包含任何Numbus依赖项。