2011-11-27 13 views
17

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.

Trả lời

21

Bạn đang đi đúng hướng.Vì ứng dụng khi được triển khai cho appengine được đóng gói như một cuộc chiến (kho lưu trữ ứng dụng web), các thư viện lọ cần phải có trong WEB-INF/lib. Bạn nên đảm bảo các lọ của bạn ở đó và sau đó thêm các lọ đó vào đường dẫn tạo nhật thực của bạn. Hãy thử thực hiện một thao tác "sạch" trên dự án và xây dựng lại nó để đảm bảo các thư viện nằm trong gói.

+0

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? –

+1

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 đó :) –

+0

Đô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 đề. –

4

giải pháp này rằng:

  • nguồn sao chép (.jar file) vào chiến tranh/thư mục lib WEB-INF/
2

Bạn vẫn cần thêm các tập tin jar vào con đường xây dựng để java tránh các lỗi biên dịch sau khi thêm các tệp vào thư mục war/WEB-INF/lib!

1

Sao chép dán các tệp .jar vào war/WEB-INF/lib và sau đó chuyển đến Thuộc tính (của dự án trong Eclipse) -> Đường dẫn xây dựng Java -> Thêm JAR -> Chọn các liên kết .jars từ dự án hiện tại. Bạn nên được tất cả các thiết lập!

0

Có thể là "hơi" quá muộn cho điều này, nhưng trong nhật thực bạn không phải sao chép thủ công. Nhấp chuột phải vào dự án -> Đường dẫn xây dựng -> Cấu hình đường dẫn xây dựng ... -> chọn Triển khai hội (bên trái). Thêm lọ của bạn ở đây và chúng sẽ được bao gồm khi triển khai.