2009-11-30 22 views
34

Gần đây tôi đã chuyển sang J2EE từ .NET, và tôi đang nhầm lẫn về nơi đặt các tệp JAR. Tôi biết rằng CLASSPATH, WEB-INF và Java Web Path của Eclipse là tất cả những nơi mà các JAR có thể được lưu trữ, nhưng tôi nhầm lẫn về thư mục nào cần sử dụng, khi nào và tại sao.CLASSPATH, Đường dẫn Buld Java (nhật thực) và WEB-INF LIB: những gì cần sử dụng, khi nào và tại sao?

Trước hết, chúng tôi có CLASSPATH. Tôi thường thiết lập điều này bằng cách đi vào "Biến môi trường" bên trong "Máy tính của tôi". Tôi biết rằng đây là nơi mặc định, nơi trình biên dịch Java tìm kiếm các tệp JAR. Khi tôi thêm một thư mục hoặc một JAR vào biến môi trường CLASSPATH của tôi, tại sao nó bị bỏ qua bởi Eclipse, trình biên dịch Java và máy chủ web?

Ngoài ra, tôi biết rằng WEB-INF \ LIB là nơi bạn có thể đặt các tệp JAR mà ứng dụng web của bạn sẽ sử dụng. Tuy nhiên, tôi đã đặt các JAR trong WEB-INF \ LIB chỉ để chúng bị bỏ qua. Trong những tình huống nào tôi nên đưa các JAR vào thư mục WEB-INF \ LIB? Làm thế nào để tôi nhận được Eclipse hoặc máy chủ web để thông báo cho họ?

Cho đến nay, điều duy nhất phù hợp với tôi là thực sự thay đổi Đường dẫn xây dựng Java cho một dự án Eclipse. Tôi sẽ chọn các JAR tôi cần và nhấn "Thêm các JAR bên ngoài". Hầu hết thời gian khi tôi làm điều này, Eclipse sẽ nhận ra các JAR của tôi và đọc các lớp trong đó. Tuy nhiên, tôi đã chạy vào một loạt các lỗi ngẫu nhiên lạ trong khi làm điều này (chủ yếu là phải làm với phụ thuộc, tôi nghĩ). Vì lý do nào đó, tôi chỉ có cảm giác rằng đây không phải là cách đúng đắn để làm mọi thứ, và rằng tôi đang thiếu một số thông tin quan trọng. Khi nào tôi nên thêm thủ công các JAR bên ngoài bên trong Eclipse, và khi nào tôi nên làm những việc khác nhau? Làm thế nào đến Java Build Path của Eclipse dường như không biết về các thư mục trong biến môi trường CLASSPATH của tôi? Thực sự, tôi chỉ muốn hiểu rõ hơn về CLASSPATH, Đường dẫn xây dựng Java của Eclipse và thư mục WEB-INF/LIB - mục đích mà chúng phục vụ, mối quan hệ giữa chúng và nơi tôi nên đặt JAR của tôi trong các tình huống khác nhau. Tôi sẽ đánh giá cao bất kỳ lời khuyên nào bạn có thể cho tôi, hoặc bất kỳ bài viết nào mà bạn có thể giới thiệu.

Cảm ơn bạn.

+0

Ồ, và một câu hỏi khác - nếu ứng dụng web của tôi yêu cầu một JAR nhất định, tôi có cần thêm JAR đó vào Run Configuration cũng như Đường dẫn xây dựng của dự án? Các cấu hình chạy và xây dựng đường dẫn luôn luôn hoàn toàn tách biệt mọi thứ, hoặc không bao giờ ảnh hưởng đến khác? – sangfroid

+0

(và có, giả định rằng tôi đang chạy dự án web của tôi từ Eclipse) – sangfroid

+0

Làm cách nào chúng tôi có thể thực hiện việc này cho các trang EAR/lib? http://stackoverflow.com/questions/29753457/jasper-reports-package-net-sf-jasperreports-engine-does-not-exist-exception-in Kính trọng, –

Trả lời

30

CLASSPATH bạn đặt trong môi trường của mình chỉ ảnh hưởng đến các ứng dụng Java độc lập, tức là những ứng dụng bạn chạy từ lời nhắc lệnh hoặc biểu tượng. Như bạn đã thấy, Eclipse bỏ qua điều này. Nó thiết lập classpath riêng cho từng dự án của nó.

javacjava, nếu được gọi từ dấu nhắc lệnh, nên/có thể tôn trọng đường dẫn này, nhưng nó không còn được coi là thực hành tuyệt vời để thực hiện việc này. Hóa ra là mọi ứng dụng đều cần bộ công cụ riêng của mình, vì vậy một CLASSPATH toàn cầu không thực sự làm bất kỳ thứ gì trong số đó. Thực hành hiện đại là chỉ cần chỉ định đường dẫn lớp với tùy chọn -cp trên dòng lệnh cho javac hoặc java.

Máy chủ ứng dụng web độc lập cũng sẽ thiết lập đường dẫn lớp riêng của nó. Từ dòng lệnh hoặc GUI, WebAppServers thường được bắt đầu bởi một tập lệnh (.BAT hoặc .sh) thiết lập đường dẫn lớp bằng cách sử dụng -cp. Tomcat có một thư mục có tên là common hoặc common/lib nơi thư viện dự kiến ​​sẽ thấy các thư viện có sẵn trên máy chủ và tất cả các chương trình đang chạy trong đó. Nhưng bạn thường sẽ không cần/muốn gây rối với điều này, vì nó là phong tục cho các ứng dụng để cung cấp bộ sưu tập thư viện của riêng mình trong WEB-INF/lib. Vì vậy, đối với một ứng dụng Web, bạn sẽ đặt các lọ khác nhau của bạn vào thư mục lib, dưới WEB-INF, giả sử Eclipse xây dựng sẵn cấu trúc thư mục như vậy cho bạn.

Tất cả các lib bạn cần cũng cần được làm cho Eclipse biết. Trong trình khám phá dự án, tôi chọn toàn bộ số lượng của chúng một lần, nhấp chuột phải và chọn Build Path | add to build path. Điều đó dễ dàng hơn là làm rối tung đường dẫn xây dựng dự án của Eclipse theo cách thủ công.

+1

Một điều cần nhớ là Eclipse sẽ nhận ra tất cả 'jar' trong' WEB-INF/lib' và chúng ta không cần phải thêm chúng vào đường dẫn xây dựng. Nó chỉ cần thiết cho những 'jar' trong một đường dẫn khác. – FaithReaper

2

Nếu bạn đang xử lý các ứng dụng web,/WEB-INF/lib là nơi di động để đặt các JAR. Đây là nơi máy chủ web vùng chứa servlet mong muốn tìm tệp jar của ứng dụng.

2

Eclipse yêu cầu bạn chỉ định đường dẫn đến thư viện, tệp jar (trên Thuộc tính -> Đường dẫn xây dựng Java -> Thư viện tab). Điều này có thể được tìm thấy trên tệp .classpath project.

Thông thường bạn có libs JRE trên đường dẫn của nó (cũng sẽ nằm trên đường dẫn lớp của bạn), vì vậy việc thêm libs vào classpath và cập nhật đường dẫn eclipse build sẽ hoạt động.

Thư mục WEB-INF phải là nơi chứa thông tin cần thiết cho ứng dụng web của bạn.

2

Tôi không phải là một chuyên gia Eclipse, nhưng tôi nghĩ rằng vấn đề của bạn có thể được trả lời như thế này:

1) CLASSPATH là một biến môi trường được đọc trong khi bạn khởi động chương trình java và được sử dụng bởi classloader để tìm ra nơi đặt các lớp.

Tôi sẽ sửa đổi biến CLASSPATH chỉ trong trường hợp bạn khởi chạy chương trình java từ tập lệnh, vì điều này cho phép bạn khởi chạy chương trình một cách thuận tiện và đảm bảo rằng các lớp được tìm thấy. Đây không phải là trường hợp của bạn, vì bạn đang phát triển ứng dụng web.

2) WEB-INF/lib là thư mục chứa trình nạp lớp của ứng dụng web (như tomcat hoặc glassfish) xem liệu ứng dụng web của bạn có cần phân giải lớp hay không. Vì vậy, bạn đặt ở đó các lớp được sử dụng trong ứng dụng web của bạn.

Một số IDE bao gồm các tệp thư viện/.jar mà bạn đang sử dụng trong dự án tự động vào gói.

3) Thư viện Eclipse/classpath giải quyết trong thời gian phát triển. Tôi sẽ giả định, nhưng xin lỗi vì giả định, vì bạn thực sự không nên làm điều này;), bạn có thể định nghĩa một thư viện (thêm các tệp .jar bên ngoài vào dự án) và tự động hoàn thành/tất cả các tính năng thú vị khác sẽ bắt đầu làm việc với điều này, về cơ bản bạn làm cho các lớp đó hiển thị cho IDE với hoạt động đó. Tôi cũng giả định rằng sau đó bạn có thể đánh dấu các thư viện đó sẽ tự động được thêm vào các dự án web, vv, bởi IDE.

Nói chung đọc tốt về cách các lớp được tìm thấy trong khi thực thi là here (đó là tài liệu chính thức của mặt trời). Ngoài ra một nơi tốt để đọc về điều này là tài liệu lớp ClassLoader.

+0

(1) Không, Eclipse muốn các thư viện được xác định rõ ràng qua đường dẫn xây dựng của dự án. (2) Tài liệu về trình nạp lớp của Sun là có thẩm quyền, đầy đủ và chỉ dẫn, nhưng khi nói đến làm việc trong một IDE, nó chỉ hữu ích như thông tin cơ bản. Eclipse làm việc chăm chỉ để trừu tượng hóa các vấn đề này cho người dùng; trong khi thường có lợi, điều này có thể gây nhầm lẫn cho người mới bắt đầu. –

11

Java có một lịch sử lâu dài và kinh nghiệm đã chỉ ra rằng một số ý tưởng là tốt và một số là xấu. Biến môi trường CLASSPATH là cách ban đầu để báo cho máy Java biết vị trí các lớp từ chương trình của bạn, và hoạt động tốt cho các chương trình dòng lệnh một cách hợp lý. Nó đã nhanh chóng được tìm thấy rằng điều này không phải là một điều toàn cầu (như có xu hướng mess điều lên trong thời gian dài) nhưng một điều cho mỗi chương trình. Điều này có thể được thực hiện bằng cách tạo một kịch bản lệnh wrapper/BAT-file để đặt biến và chạy máy Java.

Tất cả đều ổn, sau đó mọi người muốn viết nội dung máy chủ web trong Java.API Servlet được tạo khi ứng dụng web là đơn vị độc lập - kết quả là CLASSPATH cho mỗi ứng dụng web các tệp chưa được đóng gói trong WEB-INF/classes cộng với tệp jar trong WEB-INF/lib. Và chỉ thế thôi. Điều này có nghĩa là biến CLASSPATH toàn cầu bị bỏ qua. Điều này đã được tìm thấy là một điều tốt đẹp, vì vậy khái niệm đã di chuyển ở nơi khác.

Ví dụ: "jar thực thi" (được gọi là "jar chạy được") được gọi bằng "java -jar foobar.jar" chứa đường dẫn lớp hoàn chỉnh INSIDE the Jar trong tệp kê khai đặc biệt. Bắt đầu Java Web được sử dụng để khởi động các chương trình java từ một máy chủ web sẽ liệt kê đầy đủ đường dẫn lớp đầy đủ trong tệp cấu hình trên máy chủ.

Nhưng, để giúp bạn bắt đầu. Nếu bạn muốn viết một ứng dụng web Java:

  1. Tải phiên bản Eclipse Java EE.
  2. Tạo dự án web động mới, ví dụ: đặt tên là foobar.
  3. Kéo và thả (hoặc sao chép/dán) các tệp jar bạn cần trong foobar/WebContent/WEB-INF/lib
  4. Tạo tệp mới có tên foobar/WebContent/index.jsp. Trong loại tệp trống <h1>Hello World <%= new java.util.Date() %></h1>
  5. Nhấp chuột phải vào trình chỉnh sửa cho index.jsp, chọn Chạy -> Chạy trên máy chủ và chọn Xem trước cơ bản -> J2EE tại máy chủ cục bộ và Kết thúc.

Cửa sổ trình duyệt hiện sẽ mở, trong trình duyệt hoặc bên trong Eclipse sẽ hiển thị trang JSP của bạn. Bạn có thể thay đổi trang JSP, lưu nó bằng Ctrl-S và tải lại cửa sổ trình duyệt để xem các thay đổi.

+0

@SanderVerhagen Tôi không hiểu bình luận của bạn. Câu hỏi rõ ràng là trong ngữ cảnh của một thùng chứa web (thường được chạy trong Java SE). –

+0

@SanderVerhagen No. Tất cả sự hỗ trợ cho bất cứ điều gì liên quan đến servlets và ở trên là trong Plugins sắp được cài đặt sẵn với EE (bạn có thể cài đặt từ Marketplace cho SE). Bạn có thể thực hiện các WAR đơn giản mà không cần EJB. –

+0

Cách đơn giản nhất để bắt đầu với một ứng dụng web trong những ngày này là sử dụng gói Netbeans + Glassfish. –

4

Ngoài ra, tôi biết rằng WEB-INF \ LIB là nơi bạn có thể đặt các tệp JAR mà ứng dụng web của bạn sẽ sử dụng. Tuy nhiên, tôi đã đặt các JAR trong WEB-INF \ LIB chỉ để chúng bị bỏ qua. Trong những tình huống nào tôi nên đưa các JAR vào thư mục WEB-INF \ LIB? Làm thế nào để tôi nhận được Eclipse hoặc máy chủ web để thông báo cho họ?

Các thực vấn đề bạn có ở đây là khả năng mà bạn không có Eclipse for Java EE developers và/hoặc mà bạn vừa tạo một generic Java Dự án thay vì một dự án Dynamic Web và xây dựng các thư mục cần thiết cấu trúc chính mình.

Nếu bạn tạo một Dynamic Web Project trong Eclipse cho các nhà phát triển Java EE, sau đó Eclipse sẽ Automagically thêm bất kỳ thư viện trong WEB-INF/lib đến xây dựng con đường. Đường dẫn xây dựng gần như được nói chỉ là đường dẫn lớp được sử dụng trong cả thời gian chạy thử và thời gian chạy. Nói cách khác: chỉ cần thả JAR của bên thứ 3 vào đó, thực sự không cần phải làm gì nữa.

Lưu ý rằng Java phân biệt chữ hoa chữ thường, do đó, nó nên được gọi là WEB-INF/lib, không phải là WEB-INF/LIB. Nhưng dù sao, nếu bạn tạo Dự án web động, thì Eclipse sẽ tự động tạo cấu trúc thư mục/tệp chính xác cho bạn.

Được người khác nói, bỏ qua biến môi trường %CLASSPATH%. Đó là chỉ sử dụng bởi javac.exe/java.exe và thậm chí sau đó chỉ khi bạn làm không xác định bất kỳ -cp, -classpath hoặc - jar đối số. Trong thế giới thực, biến môi trường này hiếm khi được sử dụng, nó chỉ là một số tiện lợi cho người mới bắt đầu (và cũng không may là cái khó hiểu nhất, họ không bao giờ nên phát minh ra nó).

2

Cùng nhau, các nhận xét cũng giúp ích cho tôi. Tôi đã thêm tất cả các jena .jars vào đường dẫn xây dựng từ nhật thực nhưng điều đó là không đủ. Đề xuất sau đây để "thêm vào WEB-INF/lib" nó có vẻ trực quan để kéo từ thư mục thư viện đến WEB-INF (từ trong nhật thực), nhưng điều đó không hoạt động. Cũng không sao chép các tệp .jars sang WEB-INF. Cuối cùng tôi kéo và thả từ cửa sổ máy tính để bàn vào thư mục WEB-INF lib trong Eclipse, và điều đó đã khắc phục được sự cố. Nó sẽ là tốt đẹp nếu bất kỳ .jars thêm vào đường dẫn xây dựng đã được tự động sao chép vào WEB-INF lib bởi Eclipse. Trong trường hợp nó quan trọng, đây là eclipse EE IDE, Indigo release, trên windows 7.

Các vấn đề liên quan