2013-05-24 28 views
13

Tôi có một trường hợp cần phải có thư mục chứa các nguồn Java được sử dụng làm thư mục nguồn cho một số dự án maven "bên cạnh nhau" trong cấu trúc cây . Do sự khác biệt phụ thuộc đối với các projets maven, tôi không thể tạo một tạo phẩm có chứa phiên bản đã biên dịch của các nguồn, nhưng cần phải có từng dự án coi nó như một thư mục nguồn ngoài src/main/java. Rõ ràng Maven có thể làm điều này một cách dễ dàng bằng cách thêm một thư mục nguồn khác nằm trong "../foo/src", nhưng m2e từ chối làm điều này, và để làm việc này tốt cho chúng ta, tôi cần nó làm việc trong Eclipse .m2e: Thư mục chứa java _sources_ cần được một số dự án m2e sử dụng

Làm thế nào tôi sẽ đi vào có một cấu trúc như:

/common/src 
/a/pom.xml (add source folder ../common/src) 
/a/src/main/java/... 
/b/pom.xml (add source folder ../common/src) 
/b/src/main/java/.... 

và làm cho nó làm việc trong Eclipse?

(lưu ý: Tôi nhận thức của http://dev.eclipse.org/mhonarc/lists/m2e-users/msg01988.html - đó là, tuy nhiên, từ năm 2011)

+0

Bạn đã thử [Plugin xây dựng trợ giúp Maven] (http://mojo.codehaus.org/build-helper-maven-plugin/)? – noahlz

+0

@noahz Nó hoạt động từ dòng lệnh. –

Trả lời

1

Bạn sẽ có thể sử dụng đường dẫn tương đối và Maven Build Helper như một giải pháp.

Trong mỗi dự án, hoặc trong một "cha mẹ" pom.xml rằng tất cả họ đều kế thừa từ, thêm dòng sau:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>build-helper-maven-plugin</artifactId> 
    <version>1.8</version> 
    <executions> 
     <execution> 
     <id>add-source</id> 
     <phase>generate-sources</phase> 
     <goals> 
      <goal>add-source</goal> 
     </goals> 
     <configuration> 
      <sources> 
      <source>${basedir}/../../common/src</source> 
      </sources> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 
+0

Vì vậy, điều này làm việc với m2e trong Eclipse? –

+0

Nên dễ dàng, đủ để tìm hiểu. Tôi sử dụng IntelliJ ;-) – noahlz

+0

Câu hỏi đặt ra là làm thế nào để làm cho nó hoạt động với m2e trong nhật thực. Tôi có nó làm việc từ dòng lệnh. –

3

Làm thế nào về một mẹo nhỏ với hệ thống tập tin? Chỉ cần tạo liên kết tượng trưng cho các thư mục và có thể bạn đã ổn :)

Với NTFS, bạn có thể thử làm mklink từ dòng lệnh. Giải thích khác tại đây: http://en.wikipedia.org/wiki/NTFS_symbolic_link

+0

Làm cách nào để thực hiện điều này với NTFS? –

+0

đã cập nhật câu trả lời – WeMakeSoftware

1

Nếu bạn sử dụng Subversion có lẽ cách tiếp cận thuận tiện nhất là giữ thư mục nguồn chia sẻ trong một kho lưu trữ riêng biệt và thêm nó vào tất cả các dự án cần bằng svn:externals. Mặt khác, điều này sẽ làm cho việc tạo ra các thẻ và các chi nhánh phức tạp hơn.

Tương tự như vậy có thể đạt được với các kho phụ Mercurial, nhưng nó sẽ không thuận tiện.

+0

Rất tiếc, không. Đây là git. –

10

Bạn nên không làm điều đó.

Nếu bạn muốn sử dụng mã đó trong các mô-đun khác nhau, thì nó cũng phải là mô-đun Maven, được sử dụng làm phụ thuộc bởi các mô-đun khác.

Vấn đề chính với những gì bạn đang cố gắng làm là mặc dù nó không phải là một bản sao thực sự/dán các nguồn giữa hai mô-đun, cuối cùng nó hoạt động như một. Điều gì sẽ xảy ra khi bạn xây dựng hai lọ? Bạn sẽ có các lớp trùng lặp, vì vậy nếu bạn sử dụng chúng trong cùng một ứng dụng thì classpath sẽ hơi sai.

Vì vậy, chính xác những gì bạn đang cố gắng hoàn thành?

  • Sử dụng lại một số mã trong hai mô-đun riêng biệt? Sau đó sử dụng nó như một cái lọ phụ thuộc.
  • Sử dụng lại mã trong hai mô-đun riêng biệt, nhưng bạn không muốn kết thúc bằng nhiều lọ? Sau đó, bạn có thể sử dụng maven-shade-plugin để nhúng phụ thuộc vào tạo phẩm cuối cùng.
  • Xây dựng hai phiên bản hơi khác nhau của cùng một thư viện? Sau đó, bạn có thể sử dụng lại plugin maven-shade để mở rộng một lọ với các nguồn bổ sung.Hoặc bạn có thể sử dụng aspectj-maven-plugin để chèn các khía cạnh vào một nhóm cơ sở của các lớp.
  • Thiết kế mã có thể kích hoạt phụ thuộc vòng tròn, vì các mô đun phụ thuộc vào mã chung, do đó phụ thuộc vào mã từ mỗi mô-đun? Việc sửa chữa thích hợp sẽ là trích xuất một API chung từ các mô-đun, mà sẽ đi vào sự phụ thuộc được chia sẻ và sẽ được thực hiện khác nhau bởi mỗi mô-đun.

Nếu bạn thực sự, thực sự phải giữ nó như một thư mục nguồn được chia sẻ thay vì chia sẻ phụ thuộc, thì bạn có thể xem this answer.

+0

Tôi cần có một mã nguồn được chia sẻ được sử dụng trong ba dự án và vì lý do kỹ thuật, nguồn cũng cần có khả năng xem nguồn của dự án sử dụng nó. Lý do là chúng tôi có thể phải cung cấp các phiên bản hơi khác nhau của cùng một nhị phân cho các nhánh khác nhau của khách hàng được đề cập. Nếu tôi chỉ có một jar phụ thuộc, tôi không thể tham khảo dự án src/main/java, nơi mà lớp dự án cụ thể sống (nhưng cần phải sử dụng đến các nhà máy và/hoặc tiêm phụ thuộc mà sẽ không cần thiết với cách tiếp cận đơn giản hơn). Các lớp trùng lặp cũng không phải là vấn đề ở đây. –

+0

Tôi hiểu, vì vậy bạn đang cố gắng tránh cả sự phụ thuộc vòng tròn và dựa vào một khuôn khổ phức tạp để tách biệt API⟷implementation. Tôi thấy tiêm phụ thuộc là một quyết định thiết kế rất tốt cho bất kỳ dự án nào, điều này sẽ làm cho việc phát triển trong tương lai trở nên có nhiều mô đun hơn.Nhưng tôi không biết dự án của bạn đã lớn đến mức nào để khuyên bạn nên điều chỉnh nó ngay bây giờ. Vì vậy, tôi sẽ giới thiệu một nhà máy đơn giản, đó là khá dễ dàng để thực hiện và sẽ không thêm nhiều phức tạp cho mã. Một hệ thống tập tin hack để có một thư mục nguồn chia sẻ là một mùi mã với tôi, đó là quyết định của bạn nếu bạn muốn sống với nó hay không. –

+0

Lưu ý rằng điều này hoạt động hoàn toàn tốt với Maven được gọi từ một dòng lệnh, abeit khi sử dụng một phần mở rộng để thêm các lọ nguồn bổ sung. Nó được mở để tranh luận nếu đó là một lỗi hoặc một tính năng. Ngay bây giờ tôi đồng ý rằng điều này không khả thi. –

1

Tại sao không chỉ đơn giản làm cho lib phổ biến là <dependency /> trong các dự án khác 'pom.xml và sử dụng tính năng "Giải quyết các phụ thuộc từ dự án không gian làm việc" của m2e (mà tôi tin là mặc định) trong các dự án phụ thuộc (bên phải) bấm vào project => project properties => Maven)?

Bằng cách đó, các dự án phụ thuộc sẽ tự động xem các lớp của lib chung trong IDE, mà bạn không cần phải xây dựng/cài đặt tạo tác lib phổ biến vào kho lưu trữ maven (cục bộ hoặc từ xa).

Vì bạn đang sử dụng Git, phân nhánh có thể giúp bạn dễ dàng cung cấp các phiên bản riêng biệt (phiên bản như trong tệp pom.xml) của lib chung và tham chiếu các phiên bản đó cho phù hợp với các yếu tố phụ thuộc của dự án <dependency />.

+0

Chủ yếu là vì tôi muốn mã được chia sẻ để có thể xem mã trong 'src/main/java' cho mỗi dự án, nói cách khác là một hồ bơi duy nhất cho mỗi dự án. –

1

Tôi sẽ sử dụng số NTFS Junction.

Tôi sử dụng chúng trong các dự án của mình để chia sẻ tài nguyên giữa các dự án mà không thực sự sao chép chúng. Một đường giao nhau giống như một lỗ đen giữa ổ đĩa và hệ thống tập tin. Chúng hoạt động giống như các liên kết cứng nhưng có thể tham khảo các thư mục, ngay cả trên các ổ đĩa khác nhau (bao gồm cả ổ đĩa mạng). Theo quan điểm của bạn, nó sẽ giống như có thư mục/common/src trong thư mục các dự án của bạn (sau đó bạn có thể yêu cầu Eclipse sử dụng nó làm thư mục nguồn). Tất nhiên bạn có thể đổi tên các điểm giao nhau, sao cho/common/src, như được thấy bởi dự án a, sẽ được gọi là common.

/common/src 
/a/src 
/a/common <- this is a junction to /common/src 

Để dễ dàng tạo Junction tôi thực sự thích sử dụng this shell extension.