【发布时间】:2012-02-14 17:10:05
【问题描述】:
我是一名大学生,正在从事一个研究项目,该项目涉及将 Web 应用程序迁移到 Amazon 的云。上个学期我一直在使用 servlet,并且能够使用运行在 Tomcat 中的 java servlet 来获得应用程序的大部分功能。
我现在正在尝试集成 Amazon Web Services,例如 SimpleDB 和电子邮件服务。我使用 Eclipse Java EE for Web Developers Indigo IDE 进行开发。我安装了 AWS 插件,并且能够运行 Amazon 提供的示例代码以成功调用 SDB 和 SES。
但是,当我尝试直接或通过单独的类从 servlet 调用 simpleDB 之类的服务时,我收到以下错误:
HTTP 状态 500 -
输入异常报告
消息
描述服务器遇到一个内部错误()阻止 它无法满足此请求。
异常
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) note 的完整堆栈跟踪 根本原因可在 Apache Tomcat/7.0.23 日志中找到。
Apache Tomcat/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。
谢谢。
【问题讨论】:
标签: java tomcat servlets amazon-web-services amazon-simpledb