Tôi đã tìm kiếm giải pháp cho vấn đề này trong nhiều giờ ngày hôm nay và nhiều giờ ngày hôm qua, vì vậy tôi quyết định giải quyết vấn đề ở đây, mặc dù có vẻ như là một vấn đề ngu ngốc.Bao gồm các tệp JAR trong dự án Eclipse (App Engine)
Tình huống: Tôi có thiết lập dự án Google AppEngine trong Eclipse Java EE. Nó tồn tại trong nhiều tuần, mọi thứ đều chạy tốt, tôi có thể triển khai với App Engine và thử nghiệm trong Eclipse mà không có các probs.
Bây giờ tôi cần thêm các gói JAR cho f.e. Hỗ trợ JSON và API hình ảnh hóa của Google. Tôi đã thử JSON cách đây một tuần và vì nó không thành công, tôi vừa tải xuống các tệp nguồn và thêm chúng vào nguồn của riêng tôi. Nhưng bây giờ với điều Visualizations, nó là quá nhiều nguồn tập tin vì vậy tôi cần các JAR làm việc.
Những gì tôi đã làm:
- tải về các tập tin JAR.
- putted chúng trong một thư mục PROJECT/lib.
- chọn chúng và nhấp chuột phải và nhấp vào Đường dẫn xây dựng> Thêm vào đường dẫn xây dựng.
Điều gì đã xảy ra: Tất cả đều ổn, tôi có thể nhập các lớp và tạo các lớp con từ chúng mà không gặp lỗi. Vì vậy, rõ ràng là Eclipse đã nhận ra sự tồn tại của các lớp và Eclipse đã nhập chúng thành công.
Sau đó, tôi đã cố gắng để xây dựng nó (Debug Mode) và nhận được lỗi sau (một trong những tôi nhận với JSON quá):
Nov 27, 2011 11:57:48 AM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: failed chartDataServlet: java.lang.NoClassDefFoundError: com/google/visualization/datasource/DataSourceServlet
Nov 27, 2011 11:57:48 AM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: failed c[email protected]727db937{/,/Volumes/Data/eclipse_workspace/kulStats/war}: java.lang.NoClassDefFoundError: com/google/visualization/datasource/DataSourceServlet
Nov 27, 2011 11:57:48 AM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: failed [email protected]: java.lang.NoClassDefFoundError: com/google/visualization/datasource/DataSourceServlet
Nov 27, 2011 11:57:48 AM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: Error starting handlers
java.lang.NoClassDefFoundError: com/google/visualization/datasource/DataSourceServlet
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.java:176)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at org.mortbay.util.Loader.loadClass(Loader.java:91)
at org.mortbay.util.Loader.loadClass(Loader.java:71)
at org.mortbay.jetty.servlet.Holder.doStart(Holder.java:73)
at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:242)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
at org.mortbay.jetty.Server.doStart(Server.java:224)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at com.google.appengine.tools.development.JettyContainerService.startContainer(JettyContainerService.java:191)
at com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:239)
at com.google.appengine.tools.development.DevAppServerImpl.start(DevAppServerImpl.java:146)
at com.google.appengine.tools.development.DevAppServerMain$StartAction.apply(DevAppServerMain.java:164)
at com.google.appengine.tools.util.Parser$ParseResult.applyArgs(Parser.java:48)
at com.google.appengine.tools.development.DevAppServerMain.<init>(DevAppServerMain.java:113)
at com.google.appengine.tools.development.DevAppServerMain.main(DevAppServerMain.java:89)
Caused by: java.lang.ClassNotFoundException: com.google.visualization.datasource.DataSourceServlet
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.java:176)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 35 more
Tôi không biết nếu thực tế là nó in ra lớp với được cắt thay vì dấu chấm là một phần của sự cố: com/google/visualization/datasource/DataSourceServlet
. Trong phần thứ hai, anh ta dùng dấu chấm.
Tôi đã tìm kiếm sự cố trong một thời gian rất dài và nghe mọi thứ về tệp classpath. tập tin classpath của tôi trông như thế này:
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" output="test-classes" path="test"/>
<classpathentry kind="con" path="com.google.appengine.eclipse.core.GAE_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="con" path="com.google.appengine.eclipse.core.GAE_CONTAINER/App Engine (1)"/>
<classpathentry kind="lib" path="war/WEB-INF/lib/chart-datasource/lib/commons-lang-2.4.jar"/>
<classpathentry kind="lib" path="war/WEB-INF/lib/chart-datasource/lib/commons-logging-1.1.1.jar"/>
<classpathentry kind="lib" path="war/WEB-INF/lib/chart-datasource/lib/opencsv-1.8.jar"/>
<classpathentry kind="lib" path="war/WEB-INF/lib/chart-datasource/visualization-datasource-1.1.1.jar"/>
<classpathentry kind="output" path="war/WEB-INF/classes"/>
</classpath>
Chỉ war/WEB-INF/classes
không tồn tại ..
Ow, điều khác: Tôi tìm thấy tài liệu về App Engine đặc biệt và đôi khi họ đề cập đến thư mục war/WEB-INF/lib
, vì vậy tôi cố gắng đặt nó ở đó. Tất nhiên sau khi xóa từ đường dẫn xây dựng và đọc sau khi di chuyển. (Đó là phiên bản của tệp classpath mà tôi đã dán).
Có ai có ý tưởng về cách giải quyết vấn đề này không? Tóm tắt: Eclipse công nhận lọ nhập khẩu, nhưng xây dựng không vì một lý do ...
EDIT: giải pháp tôi thấy như sau:
- lọ phải ở trong WEB-INF/lib
- Các tệp JAR không được nằm trong thư mục trong lib, tất cả trong thư mục gốc WEB-INF/lib. Tôi đã có của tôi trong một thư mục riêng biệt và không hoạt động.
- Tôi đã làm Nguồn> Dọn dẹp và Nguồn> Quản lý nhập và hoạt động.
Hoạt động sạch? Làm thế nào để làm điều đó? Im tương đối mới với Eclipse thực sự. Và tòa nhà? Khi tôi nhấp vào nút gỡ lỗi hoặc chạy, dự án đang xây dựng lại, phải không? –
Tôi có thể ở đâu đó ở đây cập nhật bài đăng bằng giải pháp không? Tôi tìm thấy những điều sau đây: - JAR thực sự phải ở trong WEB-INF/lib - JAR không được nằm trong thư mục trong lib, tất cả trong thư mục gốc WEB-INF/lib. Tôi đã có của tôi trong một thư mục riêng biệt và không hoạt động. - Tôi đã làm Nguồn> Dọn dẹp và Nguồn> Quản lý nhập và sau đó hoạt động sau đó :) –
Đôi khi nhật thực không sao chép các jars được chỉ định trong đường dẫn xây dựng đến thư mục WEB-INF/lib. trong trường hợp của tôi, mục thư viện theo thứ tự và tab xuất của thiết lập đường dẫn xây dựng được bỏ chọn (Tôi không biết tại sao) vì vậy tôi chỉ kiểm tra tất cả và giải quyết vấn đề. –