Maven: Làm thế nào để đưa các lọ, những cái không có sẵn trong các đại diện vào một dự án J2EE?


100

trong dự án J2EE của tôi, tôi có một vài phụ thuộc, không có sẵn trong bất kỳ kho lưu trữ Maven nào, vì chúng là thư viện độc quyền. Các thư viện này cần phải có sẵn trong thời gian chạy, do đó phải được sao chép vào đích /.../ WEB-INF / lib ...

Hiện tại, tôi đang liệt kê chúng dưới dạng phụ thuộc hệ thống trong POM của mình, nhưng với phương pháp này, vấn đề là không được sao chép vào bản dựng đích trong quá trình biên dịch. Ngoài ra phương pháp này không phải là rất thanh lịch.

Vậy đâu là cách tốt nhất để tích hợp chúng vào Maven?

Lưu ý: Tôi không muốn tạo kho lưu trữ Maven của riêng mình.


7
Tôi thực sự nghĩ rằng bạn nên xem lại quyết định tạo kho lưu trữ Maven của mình. Nó không khó chút nào và 100% xứng đáng.
Robert Munteanu,

7
Giá trị của việc tạo kho lưu trữ Maven phụ thuộc vào hoàn cảnh.
yincrash

Câu trả lời:


54

Như bạn đã nói rằng bạn không muốn thiết lập kho lưu trữ của riêng mình, có lẽ điều này sẽ hữu ích.

Bạn có thể sử dụng mục tiêu tệp cài đặt của maven-install-plugin để cài đặt tệp vào kho lưu trữ cục bộ. Nếu bạn tạo một tập lệnh với lời gọi Maven cho mỗi tệp và giữ nó bên cạnh các bình, bạn (và bất kỳ ai khác có quyền truy cập) có thể dễ dàng cài đặt các bình (và các tệp pom liên quan) vào kho lưu trữ cục bộ của chúng.

Ví dụ:

mvn install:install-file -Dfile=/usr/jars/foo.jar -DpomFile=/usr/jars/foo.pom
mvn install:install-file -Dfile=/usr/jars/bar.jar -DpomFile=/usr/jars/bar.pom

hay chỉ

mvn install:install-file -Dfile=ojdbc14.jar -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0 -Dpackaging=jar

Sau đó, bạn có thể tham chiếu các phụ thuộc như bình thường trong dự án của mình.

Tuy nhiên, đặt cược tốt nhất của bạn vẫn là thiết lập một kho lưu trữ từ xa nội bộ và bản thân tôi khuyên bạn nên sử dụng Nexus . Nó có thể chạy trên hộp phát triển của bạn nếu cần và chi phí là tối thiểu.


1
Cảm ơn phương pháp này đang làm việc tốt cho tôi bây giờ. Tôi đã mở rộng POM để các tệp đang được tự động cài đặt vào đại diện cục bộ: pastebin.ca/1504318
samon

Rất vui khi được giúp đỡ, nhưng như những người khác đã nói, cách tiếp cận tốt nhất sẽ là sử dụng trình quản lý kho lưu trữ Maven. Cách tiếp cận này không mở rộng quy mô tốt.
Người bán giàu có vào

4
Lệnh phù hợp với tôi: "mvn install: install-file -Dfile = cassandra-jdbc-1.1.1.jar -DgroupId = org.apache-extras.cassandra-jdbc -DartifactId = cassandra-jdbc -Dversion = 1.1.1 -Dpackaging = jar "
Mazrick

193

Đối với những người muốn một giải pháp nhanh chóng cho vấn đề này:

<dependency>
  <groupId>LIB_NAME</groupId>
  <artifactId>LIB_NAME</artifactId>
  <version>1.0.0</version>
  <scope>system</scope>
  <systemPath>${basedir}/WebContent/WEB-INF/lib/YOUR_LIB.jar</systemPath>
</dependency>

chỉ cần cung cấp cho thư viện của bạn một tên nhóm và cấu phần phần mềm duy nhất và trỏ đến vị trí của nó trong hệ thống tệp. Bạn tốt để đi.

Tất nhiên đây là một bản sửa lỗi nhanh bẩn CHỈ hoạt động trên máy của bạn và nếu bạn không thay đổi đường dẫn đến libs. Nhưng đôi khi, đó là tất cả những gì bạn muốn, chạy và thực hiện một vài thử nghiệm.

CHỈNH SỬA: chỉ cần tô lại câu hỏi và nhận ra người dùng đã sử dụng giải pháp của tôi như một giải pháp khắc phục tạm thời. Tôi sẽ để lại câu trả lời của mình như một sự trợ giúp nhanh chóng cho những người khác trả lời câu hỏi này. Nếu ai không đồng ý với điều này xin vui lòng để lại cho tôi một bình luận. :)


4
Mát mẻ. Có cách nào để chỉ định một URL thay vì một đường dẫn máy cục bộ không?
phreakhead

3
Cảm ơn bạn cho một ví dụ hoàn chỉnh và hoạt động !!! Tôi hy vọng bạn bắt được một con cá vàng và nó ban cho bạn ba điều ước. :)
johndodo

14
Đây phải là câu trả lời được chấp nhận vì nó tự chứa (trong pom.xml)
Vikram

2
Xin chào Rajarshee, id nhóm và id tạo tác là hoàn toàn tùy ý. Đường dẫn đến jar của bạn trong hệ thống tệp là tất cả những gì quan trọng để nó hoạt động. Bởi vì trên thực tế, cái lọ không phải là vật phụ thuộc vào maven nên bạn chỉ bảo Maven đối xử với nó như một.
Ric Jafe

1
Tính đến năm 2016, điều này dường như không hoạt động. Bản dựng thừa nhận đường dẫn nhưng không bao gồm mã trong bình bóng mờ. Chuột ...
markthegrea

24

Tạo một thư mục kho lưu trữ trong dự án của bạn. Hãy lấy

${project.basedir}/src/main/resources/repo

Sau đó, cài đặt jar tùy chỉnh của bạn vào repo này:

mvn install:install-file -Dfile=[FILE_PATH] \
-DgroupId=[GROUP] -DartifactId=[ARTIFACT] -Dversion=[VERS] \ 
-Dpackaging=jar -DlocalRepositoryPath=[REPO_DIR]

Cuối cùng, thêm các định nghĩa repo và phụ thuộc sau vào các dự án pom.xml:

<repositories>
    <repository>
        <id>project-repo</id>
        <url>file://${project.basedir}/src/main/resources/repo</url>
    </repository>
</repositories>

<dependencies>    
    <dependency>
        <groupId>[GROUP]</groupId>
        <artifactId>[ARTIFACT]</artifactId>
        <version>[VERS]</version>
    </dependency>
</dependencies>

1
Điều này làm việc rất tốt cho tôi. PS Tôi muốn giới thiệu một thư mục khác nhau cho các repo địa phương như đặt nó trong "src" dường như không đúng (nó không phải là nguồn!)
davidfrancis

1
Nó làm việc như một say mê. Tôi đang di chuyển một dự án cũ từ Ant sang Maven và có một số lib mà tôi không thể tìm thấy trong kho lưu trữ web.
Paulo Pedroso

Thận trọng: khi giá trị cho -DlocalRepositoryPath không kết thúc bằng /(tức là chỉ ra một thư mục), thì kho lưu trữ đó được tạo bằng groupId. Ví dụ: nếu id nhóm là foo.comvà localRepositoryPath là repo, thì thư mục kho sẽ trở thành repo.foo.com.
Sheshadri Mantha

Thủ tục này giống như một dự án cục bộ với hệ thống quản lý kho lưu trữ bằng cách sử dụng công cụ tự động hóa xây dựng maven được sử dụng chủ yếu cho các dự án Java và hệ thống tệp.
Oleksii Kyslytsyn

8

Bạn cần thiết lập một kho lưu trữ cục bộ sẽ lưu trữ các thư viện như vậy. Có một số dự án làm chính xác điều đó. Ví dụ như Artifactory .


4
Một điểm về thuật ngữ, đó là các kho lưu trữ từ xa nội bộ, không phải các kho lưu trữ cục bộ. Kho lưu trữ cục bộ là kho lưu trữ trên hệ thống tệp cục bộ được tải xuống.
Rich Seller

3

Không có giải pháp nào hoạt động nếu bạn đang sử dụng Jenkins build !! Khi pom được chạy bên trong máy chủ xây dựng Jenkins .. các giải pháp này sẽ không thành công, vì Jenkins chạy pom sẽ cố tải xuống các tệp này từ kho lưu trữ doanh nghiệp.

Sao chép các lọ trong src / main / resources / lib (tạo thư mục lib). Đây sẽ là một phần của dự án của bạn và đi đến máy chủ triển khai. Trong máy chủ triển khai, hãy đảm bảo rằng các tập lệnh khởi động của bạn chứa src / main / resources / lib / * trong classpath. Viola.


2

bạn có thể cài đặt chúng trong kho lưu trữ riêng, cục bộ (ví dụ: .m2 / kho trong thư mục chính của bạn): thêm chi tiết tại đây


7
Vâng, tôi có thể làm điều đó, nhưng sau đó tôi phải nói với tất cả những ai muốn xây dựng dự án rằng anh ta phải đặt các tệp X, Y vào thư mục Z và điều đó thực sự phức tạp. Sau cùng, tôi muốn sử dụng Maven để đơn giản hóa quá trình xây dựng.
samon 22-07-09

2

Nếu tôi hiểu rõ, nếu những gì bạn muốn làm là xuất các tệp phụ thuộc trong giai đoạn biên dịch để không cần truy xuất thủ công từng thư viện cần thiết, bạn có thể sử dụng các bản sao phụ thuộc mojo .

Hy vọng nó có thể hữu ích trong trường hợp của bạn ( ví dụ )


2

Giải pháp của @Ric Jafe là giải pháp phù hợp với tôi.

Điều này thật đúng với gì mà tôi đã tìm kiếm. Một cách để đẩy nó qua cho mã thử nghiệm nghiên cứu. Không có gì lạ mắt. Vâng, tôi biết rằng đó là những gì họ nói :) Các giải pháp plugin maven khác nhau dường như là quá mức cần thiết cho mục đích của tôi. Tôi có một số lọ đã được đưa cho tôi dưới dạng lib của bên thứ ba với một tệp pom. Tôi muốn nó biên dịch / chạy nhanh chóng. Giải pháp mà tôi đã thích nghi một cách đáng kể với python này đã mang lại hiệu quả kỳ diệu cho tôi. Cắt và dán vào pom của tôi. Mã Python / Perl cho tác vụ này có trong phần Hỏi & Đáp này: Tôi có thể thêm các lọ vào đường dẫn xây dựng maven 2 mà không cần cài đặt chúng không?

def AddJars(jarList):
  s1 = ''
  for elem in jarList:
   s1+= """
     <dependency>
        <groupId>local.dummy</groupId>
        <artifactId>%s</artifactId>
        <version>0.0.1</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/manual_jars/%s</systemPath>
     </dependency>\n"""%(elem, elem)
  return s1

Giải pháp trên trả về 'dependencies.dependency.systemPath' cho xx.jar không nên trỏ vào các tệp trong thư mục dự án. Xem stackoverflow.com/questions/10935135/…
sarah.ferguson


1

Cài đặt một mình không hoạt động cho tôi.

mvn deploy:deploy-file -Durl=file:///home/me/project/lib/ \
  -Dfile=target/jzmq-2.1.3-SNAPSHOT.jar -DgroupId=org.zeromq \  
  -DartifactId=zeromq -Dpackaging=jar -Dversion=2.1.3
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.