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/java
và src/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:
- 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; - 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.