2011-02-10 6 views
11

Lưu ý: Tôi không nhận được bất kỳ phản ứng trong phiên bản đầu tiên của câu hỏi này, vì vậy tôi sửa đổi nó để được chung chung hơn ...Làm cách nào để quản lý tài nguyên được chia sẻ cho một số ứng dụng web trong Maven AND Eclipse?

Context

Dự án của tôi được chia thành nhiều maven các mô-đun và một số ứng dụng web. Đây là cấu trúc:

my-project 
    + pom.xml 
    +-- commons 
    +-- persistence 
    +-- ... 
    +-- web-app-1 
    +-- web-app-2 
    +-- ... 

Tất cả các ứng dụng web chia sẻ tài nguyên chung, chẳng hạn như JS, CSS và tệp hình ảnh.

Thay vì sao chép các tài nguyên này trong mỗi web-app-X, tôi quyết định tạo một dự án khác gọi là web-resources, là một dự án WAR. Cấu trúc là sau đó một trong những sau:

my-project 
    + pom.xml 
    +-- commons 
    +-- persistence 
    +-- ... 
    +-- web-app-1 
    +-- web-app-2 
    +-- ... 
    +-- web-resources 
     +-- pom.xml 
     +-- src/main/webapp 
      +-- web.xml (which is almost empty, just need to be present for Maven) 
      +-- web_resources 
       +-- css 
       +-- images 
       +-- javascript 

Maven

Trong Maven 2 (hoặc 3 Maven, như tôi chỉ cần di chuyển dự án của tôi để maven 3.0.2), cấu hình này là dễ quản lý như tất cả web-app-X tuyên bố web-resources như một sự phụ thuộc:

<groupId>foo.bar</groupId> 
<artifactId>web-app-1</artifactId> 
... 
<dependencies> 
    <dependency> 
     <groupId>foo.bar</groupId> 
     <artifactId>web-resources</artifactId> 
     <version>${preclosing-version}</version> 
     <type>war</type> 
    </dependency> 
    ... 

vì vậy, khi tôi xây dựng dự án WAR của tôi, trước hết nó có được web-resources.war (được xây dựng ngay trước đó), giải nén nó và xây dựng trên đầu trang ứng dụng web web-app-X. Bằng cách này, tệp WAR của tôi cũng sẽ chứa một thư mục có tên là web-resources/ có chứa các tài nguyên được chia sẻ.

Đây là nguyên tắc che phủ chiến tranh.

Vì vậy, trên quan điểm của Maven, mọi thứ đều ổn!


Eclipse

Bây giờ, ở đây có vấn đề chính: có một cấu hình Eclipse tốt.

Câu hỏi: Tôi có thể sử dụng cấu hình hiện tại của mình để Eclipse quản lý đúng cách không? Cụ thể, khi tôi triển khai bất kỳ web-app-X nào trong Tomcat bằng Eclipse ...

Lưu ý rằng tôi muốn có cấu hình tự động hóa hơn và tránh mọi bước thủ công vì cấu hình này nên được hàng tá nhà phát triển sử dụng. ..

Đối với tôi, giải pháp tốt nhất dường như sử dụng các tài nguyên được liên kết của Eclipse. Do đó, tôi đặt cấu hình sau trong số web-app-X pom của mình.xml:

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-eclipse-plugin</artifactId> 
      <configuration> 
       <wtpversion>1.5</wtpversion> 
       <linkedResources> 
        <linkedResource> 
         <name>web_resources</name> 
         <type>2</type> 
         <location>${project.basedir}\..\web-resources\src\main\webapp\web_resources</location> 
        </linkedResource> 
       </linkedResources> 
      </configuration> 
     </plugin> 
     ... 

Khi tôi chạy cấu hình mvn eclipse:eclipse, nó bổ sung thêm thành công thông tin này trong tập tin .project tôi:

<projectDescription> 
    ... 
    <linkedResources> 
    <link> 
     <name>web_resources</name> 
     <type>2</type> 
     <location>C:\dev\project\web-resources\src\main\webapp\web_resources</location> 
    </link> 
    </linkedResources> 
<projectDescription> 

Bây giờ, tôi nhập khẩu dự án của tôi trong Eclipse. Sự cố: trong Project properties > Java Build Path > Source, tôi không thấy Nguồn liên kết hiện tại. Tôi chỉ thấy bốn thư mục mặc định Maven của tôi (src/main/java, src/main/resources, src/test/javasrc/test/resources). là gì lạ là khi tôi cố gắng tự thêm các nguồn lực liên kết, nó từ chối và nói rằng nó đã tồn tại ...

Vì vậy, khi tôi triển khai ứng dụng web của tôi trên Tomcat của tôi trong Eclipse, nó không triển khai thư mục web_resources và do đó tôi không triển khai CSS/JS/images.

Sau khi một số xét nghiệm, có vẻ như tôi phải làm hai sửa đổi:

  1. Thêm dòng <classpathentry kind="src" path="web_resources" output="src/main/webapp/web_resources"/> trong tập tin .classpath của tôi;
  2. Xóa <project>preclosing-web-resources</project> trong tệp .project.

Lưu ý rằng việc sử dụng cấu hình này, Eclipse sẽ sao chép (và giữ đồng bộ hóa) nội dung của dự án web_resources trong web-app-X/src/main/webapp/web_resources của tôi, nhưng đây không phải là một vấn đề (thư mục này được bỏ qua bởi SCM).

Giải pháp tự động duy nhất tôi thấy là tạo ra một Maven plugin đơn giản mà làm việc sửa đổi trước đó hai, và sau đó chạy lệnh sau đây (hoặc sử dụng một tập tin .bat):

mvn eclipse:clean eclipse:eclipse myEclipsePlugin:eclipse 

Câu hỏi

  • Có cách nào tốt hơn để quản lý cấu hình như vậy không?

Thông tin kỹ thuật

Java 6, Maven 3.0.2, maven nhật thực Plugin 2.8, Eclipse 3.3.2 (nhưng tôi có thể thử nghiệm với phiên bản mới hơn của Eclipse), không m2eclipse cắm vào.

Trả lời

6

Bắt đầu với Servlet 3.0, bạn có thể chia sẻ tài nguyên bằng cách đặt chúng trong/main/nguồn/META INF-thư mục src/nguồn lực.

Khi webapp triển khai, Servlet 3.0 cung cấp các tài nguyên đó từ đường dẫn ngữ cảnh. Ví dụ, trong trường hợp của bạn ...

web-resources 
-- src 
---- main 
------ resources 
-------- META-INF 
---------- resources 
------------ css 
-------------- global.css 
------------ images 
-------------- background.png 

Giả sử rằng my_project có một sự phụ thuộc vào web nguồn và được triển khai đến các url http://my.localhost:8080/myProject.

Với cấu hình đó, các URL sau sẽ giải quyết để các nguồn lực đúng:

NẾU bạn có một mâu thuẫn tên giữa các nguồn lực và ứng dụng thực tế của bạn , ứng dụng sẽ giành chiến thắng.

Hãy chắc chắn web.xml của bạn nói bạn đang sử dụng Servlet 3,0

<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    version="3.0">