我是一名大学生,正在从事一个研究项目,该项目涉及将 Web 应用程序迁移到亚马逊云。上学期我一直在研究 servlet,并且能够使用 Tomcat 中运行的 java servlet 来实现应用程序的大部分功能。
我现在正在尝试集成 Amazon Web Services,例如 SimpleDB 和电子邮件服务。我使用 Eclipse Java EE for Web Developers Indigo IDE 进行开发。我安装了 AWS 插件,并且能够运行 Amazon 提供的示例代码来成功调用 SDB 和 SES。
但是,当我尝试直接从 servlet 或通过单独的类调用 simpleDB 等服务时,我收到以下错误:
HTTP 状态 500 -
类型异常报告
message
描述 服务器遇到内部错误 (),导致无法执行
它从满足这个请求。
例外
javax.servlet.ServletException:实例化 servlet 类时出错
org.comtor.cloud.api.APIservlet
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:298)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
java.lang.Thread.run(Thread.java:680)根本原因
java.lang.NoClassDefFoundError:com/amazonaws/auth/AWSCredentials
java.lang.Class.getDeclaredConstructors0(本机方法)
java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)
java.lang.Class.getConstructor0(Class.java:2699)
java.lang.Class.newInstance0(Class.java:326)
java.lang.Class.newInstance(Class.java:308)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:298)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
java.lang.Thread.run(Thread.java:680)根本原因
java.lang.ClassNotFoundException:com.amazonaws.auth.AWSCredentials
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1688)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1533)
java.lang.Class.getDeclaredConstructors0(本机方法)
java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)
java.lang.Class.getConstructor0(Class.java:2699)
java.lang.Class.newInstance0(Class.java:326)
java.lang.Class.newInstance(Class.java:308)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:298)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
java.lang.Thread.run(Thread.java:680) 注意 完整的堆栈跟踪
根本原因可在 Apache Tomcat/7.0.23 日志中找到。
阿帕奇汤姆猫/7.0.23
我的代码如下所示:
package org.comtor.cloud.api;
import java.io.*;
import javax.servlet.http.*;
import javax.servlet.*;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.simpledb.AmazonSimpleDBClient;
import com.amazonaws.services.simpledb.model.CreateDomainRequest;
import java.io.IOException;
@SuppressWarnings("serial")
public class APIservlet extends HttpServlet {
public void doGet (HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
doPost(request, response);
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out = response.getWriter();
// AWS Credentials
String sAccessKey = "myAccessKey";
String sSecretKey = "mySecretKey";
// Authenticate AWS account
BasicAWSCredentials oAWSCredentials = new BasicAWSCredentials(sAccessKey, sSecretKey);
AmazonSimpleDBClient awsSimpleDBClient = new AmazonSimpleDBClient(oAWSCredentials);
// Try to access simpleDB
try
{
System.out.println("Connecting to Simple Database");
// Create a domain
String myDomain = "MyStore";
System.out.println("Creating domain called " + myDomain + ".\n");
awsSimpleDBClient.createDomain(new CreateDomainRequest(myDomain));
System.out.println("Connection Made");
}
// Print Error Stack Trace
catch (NoSuchAlgorithmException e)
{
e.printStackTrace();
}
// Close PrintWriter
out.close();
}
}
** 从代码中删除访问权限和密钥 **
SES 也是如此。我也尝试过使用像“typica”这样的 java 库,但仍然收到 NoClassDef 错误。我的构建路径中的库文件夹下有 AWS 库,并且 jar 包/类似乎在那里。所以我不确定为什么我无法使用这些类从我的 servlet 与 simpleDB 交互。
我非常感谢有关此事的任何帮助。我相信我还没有完全理解如何从 Web 环境调用 AWS SDB。
谢谢。