Maven: cách tốt nhất để liên kết JAR bên ngoài tùy chỉnh với dự án của tôi?


151

Đó là vài ngày đầu tiên tôi học Maven và tôi vẫn đang vật lộn với những điều cơ bản. Tôi có một tệp .jar bên ngoài (không có sẵn trong kho công khai) mà tôi cần tham khảo trong dự án của mình và tôi đang cố gắng tìm ra lựa chọn tốt nhất của mình là gì.

Đó là một dự án quy mô nhỏ không có kho lưu trữ trung tâm cho các thư viện, vì vậy nó phải là kho lưu trữ cục bộ (bằng cách nào đó được thêm vào kiểm soát nguồn, không biết liệu nó có hoạt động theo cách đó không?) Hoặc .jar cần được lưu trữ trên đĩa bên ngoài của bất kỳ kho lưu trữ chính thức.

1) Tùy chọn tốt nhất của tôi để thêm tệp .jar vào tài liệu tham khảo của dự án của tôi với maven cho rằng tôi muốn cả dự án và thư viện nằm trong kiểm soát nguồn?

2) Tôi dường như vẫn không thể thấy Eclipse thấy sự phụ thuộc. Tôi đã tự thêm nó vào phần của pom và nó hiển thị tốt trong danh sách Phụ thuộc trong m2eclipse. Cả mvn compile và gói mvn đều thành công, nhưng chạy chương trình cho kết quả:

Exception in thread "main" java.lang.Error: Unresolved compilation problems:
        LibraryStuff cannot be resolved to a type

Đây là sau khi chỉnh sửa POM là:

<dependency>
  <groupId>stuff</groupId>
  <artifactId>library</artifactId>
  <version>1.0</version>
  <systemPath>${lib.location}/MyLibrary.jar</systemPath>
  <scope>system</scope>
</dependency>

Tôi có nên thực hiện cài đặt mvn không: tệp cài đặt thậm chí nghĩ rằng tôi đã chỉnh sửa pom.xml như trên?

Cảm ơn!

Câu trả lời:


67

Tôi nghĩ bạn nên sử dụng mvn install:install-fileđể điền vào kho lưu trữ cục bộ của mình với các tệp thư viện sau đó bạn nên thay đổi phạm vi từ hệ thống sang biên dịch.

Nếu bạn đang bắt đầu với maven, tôi khuyên bạn nên sử dụng maven trực tiếp chứ không phải các plugin IDE vì nó thêm một lớp phức tạp.

Đối với lỗi, bạn có đặt các lọ cần thiết trên đường dẫn lớp của bạn không? Nếu bạn đang sử dụng các loại từ thư viện, bạn cũng cần có quyền truy cập vào nó trong thời gian chạy. Điều này không có gì để làm với chính maven.

Tôi không hiểu lý do tại sao bạn muốn đặt thư viện để kiểm soát nguồn - đó là mã nguồn không phải là tệp nhị phân.


36
để biết thêm về mvn install::install-file: mkyong.com/maven/ khăn
Doug T.

7
Sử dụng mvn install::install-filetrên kho lưu trữ cục bộ của bạn có nghĩa là bất kỳ ai sao chép mã nguồn của bạn cũng sẽ phải thực hiện bước thủ công này. Mặt khác, bản dựng bị hỏng
Isen Ng

điều đó sẽ không thêm jar vào tập tin chiến tranh.
Prachi

207

Bạn có thể tạo Kho lưu trữ trong dự án, do đó bạn không phải làm việc run mvn install:install-filemỗi khi bạn làm việc trên máy tính mới

<repository>
    <id>in-project</id>
    <name>In Project Repo</name>
    <url>file://${project.basedir}/libs</url>
</repository>

<dependency>
    <groupId>dropbox</groupId>
    <artifactId>dropbox-sdk</artifactId>
    <version>1.3.1</version>
</dependency>

/groupId/artifactId/version/artifactId-verion.jar

chi tiết đọc bài viết trên blog này

https://web.archive.org/web/20121026021311/charlie.cu.cc/2012/06/how-add-external-lologists-maven


2
Sử dụng giải pháp trên cho thấy cảnh báo trong khi thực hiện "gói mvn sạch" - POM cho dự án <Depency_name> bị thiếu, không có thông tin phụ thuộc.
Jignesh Gohel

Đó là giải pháp tốt nhất cho những trường hợp bạn cần thêm một hoặc chỉ một vài tệp jar. Cảm ơn.
Antonio Sesto

2
Hoặc, bạn có thể thêm các phụ thuộc cục bộ trực tiếp như trong stackoverflow.com/a/22300875/640378
mauryat 11/03/2015

2
Tôi đã phải sử dụng tệp: /// $ {project.basingir} ​​/ libs (3 dấu gạch chéo được chuyển tiếp) thay vì tệp: // $ {project.basingir} ​​/ libs
Loc Phan

2
Nếu jar được cài đặt, không phải là jar được biên dịch maven, bạn cũng sẽ cần thêm tệp pom mới để xác định siêu dữ liệu. Để tự cứu tất cả những rắc rối thủ công này, tôi khuyên bạn nên sử dụng mvn install:install-filevà sau đó sao chép toàn bộ cấu trúc thư mục từ kho lưu trữ cục bộ sang kho lưu trữ trong dự án của bạn.
Isen Ng

33

Điều này có thể dễ dàng đạt được bằng cách sử dụng phần tử <scope> lồng bên trong phần tử <phụ thuộc>.

Ví dụ:

 <dependencies>
   <dependency>
     <groupId>ldapjdk</groupId>
     <artifactId>ldapjdk</artifactId>
     <scope>system</scope>
     <version>1.0</version>
     <systemPath>${basedir}\src\lib\ldapjdk.jar</systemPath>
   </dependency>
 </dependencies>

Tham khảo: http://www.tutorialspoint.com/maven/maven_external_dependencies.htmlm


Phương thức này hoạt động rất tốt khi bạn chỉ có Maven nhúng Eclipse và bạn thiếu plugin cài đặt (hệ thống ngoại tuyến), vì vậy bạn không thể chạy installmục tiêu cho dự án phụ thuộc. Ofc có một hệ thống airgaps và có tất cả các plugin nhưng plugin cài đặt, là một tình huống khá hiếm.
Cardin Lee JH

1
Sạch sẽ và dễ dàng nhất.
Ajay Kumar

làm cách nào để thêm đường dẫn phụ thuộc cục bộ nằm ngoài thư mục $ {project.basingir}, như tôi muốn $ {dựair} \ src \ lib \ ldapjdk.jar đường dẫn lên cấp 1 trong thư mục khác
Naveen Kumar

Tôi đang gặp lỗi -"The POM for … is missing, no dependency information available” even though it exists in Maven Repository
garg10may

28

Hướng dẫn Maven nói để làm điều này:

mvn install:install-file -Dfile=non-maven-proj.jar -DgroupId=some.group -DartifactId=non-maven-proj -Dversion=1 -Dpackaging=jar

4
lệnh này cài đặt lib vào repo maven của bạn. Nhược điểm của điều này là nếu bạn cố gắng làm việc trên một dự án trong một máy tính khác, bạn phải chạy lại nó.
Charlie Wu

25

cập nhật Chúng tôi đã cài đặt máy chủ Nexus của riêng mình, dễ dàng và sạch sẽ hơn nhiều.

Tại công ty của chúng tôi, chúng tôi có một số lọ mà chúng tôi có một số lọ phổ biến nhưng không được lưu trữ trong bất kỳ kho lưu trữ nào, chúng tôi cũng không muốn có chúng trong bộ lưu trữ cục bộ. Chúng tôi đã tạo một repo mvn (công khai) rất đơn giản trên Github (nhưng bạn có thể lưu trữ nó trên bất kỳ máy chủ hoặc cục bộ nào):
lưu ý rằng điều này chỉ lý tưởng để quản lý một vài tệp jar hiếm khi

  1. Tạo repo trên GitHub:
    https://github.com/<user_name>/mvn-repo/

  2. Thêm kho lưu trữ trong pom.xml
    (Lưu ý rằng tệp thô đường dẫn đầy đủ sẽ khác một chút so với tên repo)

    <repository>
        <id>project-common</id>
        <name>Project Common</name>
        <url>https://github.com/<user_name>/mvn-repo/raw/master/</url>
    </repository>
  3. Thêm phụ thuộc vào máy chủ (Github hoặc máy chủ riêng)
    a. Tất cả những gì bạn cần biết là các tệp được lưu trữ theo mẫu được đề cập bởi @glitch
    /groupId/artifactId/version/artifactId-version.jar
    b. Trên máy chủ của bạn tạo các thư mục để phù hợp với mẫu này.
    tức là nếu bạn có một tệp jar có tên service-sdk-0.0.1.jar, hãy tạo thư mục service-sdk/service-sdk/0.0.1/và đặt tệp jar service-sdk-0.0.1.jarvào đó.
    c. Kiểm tra nó bằng cách thử tải jar từ trình duyệt (trong trường hợp của chúng tôi:https://github.com/<user_name>/mvn-repo/raw/master/service-sdk/service-sdk/0.0.1/service-sdk-0.0.1.jar

  4. Thêm phụ thuộc vào tệp pom.xml của bạn:

    <dependency>
        <groupId>service-sdk</groupId>
        <artifactId>service-sdk</artifactId>
        <version>0.0.1</version>
    </dependency>
  5. Thưởng thức


tốt, đó là giải pháp có thể mở rộng nhất mà tôi đã tìm thấy, cảm ơn
Charlie Wu

11

Đừng sử dụng systemPath. Trái với những gì mọi người đã nói ở đây, bạn có thể đặt một bình bên ngoài vào một thư mục trong thư mục dự án đã thanh toán của bạn và Maven thấy nó giống như các phần phụ thuộc khác. Đây là hai bước quan trọng:

  1. Sử dụng "mvn install: install-file" với -DlocalRep repositoryPath.
  2. Định cấu hình kho lưu trữ để trỏ đến đường dẫn đó trong POM của bạn.

Nó khá đơn giản và bạn có thể tìm thấy một ví dụ từng bước ở đây: http://randomizedsort.blogspot.com/2011/10/configuring-maven-to-use-local-l Library.html


8

Cách Maven để thêm lọ không maven vào dự án maven

Dự án Maven và lọ không maven

Thêm plugin cài đặt maven trong phần xây dựng của bạn

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-install-plugin</artifactId>
        <version>${version.maven-install-plugin}</version>
        <executions>

            <execution>
                <id>install-external-non-maven1-jar</id>
                <phase>clean</phase>
                <configuration>
                    <repositoryLayout>default</repositoryLayout>
                    <groupId>jar1.group</groupId>
                    <artifactId>non-maven1</artifactId>
                    <version>${version.non-maven1}</version>
                    <file>${project.basedir}/libs/non-maven1.jar</file>
                    <packaging>jar</packaging>
                    <generatePom>true</generatePom>
                </configuration>
                <goals>
                    <goal>install-file</goal>
                </goals>
            </execution>
            <execution>
                <id>install-external-non-maven2-jar</id>
                <phase>clean</phase>
                <configuration>
                    <repositoryLayout>default</repositoryLayout>
                    <groupId>jar2.group</groupId>
                    <artifactId>non-maven2</artifactId>
                    <version>${version.non-maven2}</version>
                    <file>${project.basedir}/libs/non-maven2.jar</file>
                    <packaging>jar</packaging>
                    <generatePom>true</generatePom>
                </configuration>
                <goals>
                    <goal>install-file</goal>
                </goals>
            </execution>
            <execution>
                <id>install-external-non-maven3-jar</id>
                <phase>clean</phase>
                <configuration>
                    <repositoryLayout>default</repositoryLayout>
                    <groupId>jar3.group</groupId>
                    <artifactId>non-maven3</artifactId>
                    <version>${version.non-maven3}</version>
                    <file>${project.basedir}/libs/non-maven3.jar</file>
                    <packaging>jar</packaging>
                    <generatePom>true</generatePom>
                </configuration>
                <goals>
                    <goal>install-file</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

Thêm phụ thuộc

<dependencies>
    <dependency>
        <groupId>jar1.group</groupId>
        <artifactId>non-maven1</artifactId>
        <version>${version.non-maven1}</version>
    </dependency>
    <dependency>
        <groupId>jar2.group</groupId>
        <artifactId>non-maven2</artifactId>
        <version>${version.non-maven2}</version>
    </dependency>
    <dependency>
        <groupId>jar3.group</groupId>
        <artifactId>non-maven3</artifactId>
        <version>${version.non-maven3}</version>
    </dependency>
</dependencies>

Tài liệu tham khảo Lưu ý Tôi là chủ sở hữu của blog


Làm thế nào để bạn biết các phiên bản của lọ và plugin cài đặt maven?
osk

các phiên bản của lọ mới được tạo thành, maven cài đặt các phiên bản plugin mới nhất
craftmannadeem

7

Nếu bạn gặp vấn đề tương tự và bạn đang sử dụng spring-boot v1.4 + , bạn có thể làm theo cách này.

mộtSystemScope bao gồm mà bạn có thể sử dụng để thêm các phụ thuộc phạm vi hệ thống vào tệp jar.

ví dụ

Tôi đang sử dụng trình điều khiển oracle vào dự án của tôi.

<dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc14</artifactId>
        <version>10.2.0.3.0</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/src/main/resources/extra-jars/ojdbc14-10.2.0.3.0.jar</systemPath>
    </dependency>

sau đó thực hiện includeSystemScope = true để đưa jar vào đường dẫn / BOOT-INF / lib / **

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <includeSystemScope>true</includeSystemScope>
    </configuration>
</plugin>

và loại trừ khỏi tài nguyên để tránh trùng lặp bao gồm, bình đủ chất béo ~

<build>
    <testSourceDirectory>src/test/java</testSourceDirectory>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <excludes>
                <exclude>**/*.jar</exclude>
            </excludes>
        </resource>
    </resources>
</build>

Chúc may mắn!


Tôi đang tìm kiếm một giải pháp như thế này, đơn giản vì khi một nhà phát triển mới đến, điều này đơn giản hóa thủ tục cài đặt. Khi bạn không có máy chủ nhân tạo, cách dễ dàng hơn để có sự phụ thuộc tùy chỉnh trong dự án của bạn. Ngoài ra khi bạn sử dụng CI, giải pháp này tránh cài đặt thủ công jar trên máy chủ CI.
Dalc

Làm thế nào về nhiều lọ ??
mithun_ghose

4

Thay đổi systemPath của bạn .

<dependency>
  <groupId>stuff</groupId>
  <artifactId>library</artifactId>
  <version>1.0</version>
  <systemPath>${project.basedir}/MyLibrary.jar</systemPath>
  <scope>system</scope>
</dependency>

3

Pom.xml sẽ xem xét kho lưu trữ cục bộ của bạn để thử và tìm ra sự phụ thuộc phù hợp với tạo phẩm của bạn. Ngoài ra, bạn không nên thực sự sử dụng các thuộc tính phạm vi hệ thống hoặc systemPath, chúng thường được dành riêng cho những thứ có trong JDK chứ không phải JRE

Xem câu hỏi này để biết cách cài đặt các tạo tác maven.


3

Lưu ý rằng tất cả các ví dụ sử dụng

<repository>...</respository> 

yêu cầu bên ngoài

<repositories>...</repositories> 

thẻ kèm theo. Nó không rõ ràng từ một số ví dụ.


2

Giải pháp tốt nhất ở đây là cài đặt một kho lưu trữ: Nexus hoặc Artifactory. Nếu cung cấp cho bạn một nơi để đặt những thứ như thế này, và hơn nữa nó tăng tốc mọi thứ bằng cách lưu trữ nội dung của bạn từ bên ngoài.

Nếu thứ bạn đang xử lý là nguồn mở, bạn cũng có thể xem xét đưa vào trung tâm.

Xem hướng dẫn .


1

Với Oxy Oxygen, bạn có thể thực hiện những điều dưới đây:

  1. Đặt thư viện của bạn trong WEB-INF / lib
  2. Dự án -> Cấu hình đường dẫn xây dựng -> Thêm thư viện -> Thư viện ứng dụng web

Maven sẽ đưa họ khi cài đặt dự án.


3
Nếu tôi làm như vậy, những người dùng khác kéo dự án của tôi có phải làm như vậy trong Eclipse không?
17:30

0

Nếu jar bên ngoài chỉ được tạo bởi dự án Maven thì bạn có thể sao chép toàn bộ dự án trên hệ thống của mình và chạy

mvn install

trong thư mục dự án. Điều này sẽ thêm jar vào thư mục .m2 là kho lưu trữ maven cục bộ.

Bây giờ bạn có thể thêm

<dependency>
     <groupId>copy-from-the=maven-pom-of-existing-project</groupId>
     <artifactId>copy-from-the=maven-pom-of-existing-project</artifactId>
     <version>copy-from-the=maven-pom-of-existing-project</version>
</dependency>

Điều này sẽ đảm bảo rằng bạn

mvn exec:java 

làm. Nếu bạn sử dụng đề xuất ở đây

<scope>system</scope>

Sau đó, bạn sẽ phải thêm các lớp riêng lẻ trong khi sử dụng thực thi thông qua dòng lệnh.

Bạn có thể thêm các lọ bên ngoài bằng lệnh sau được mô tả ở đây

mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> \
-DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>

0

Cách hiệu quả và sạch nhất mà tôi đã tìm thấy để giải quyết vấn đề này là sử dụng Gói Github

  1. Tạo một kho lưu trữ công khai / riêng tư trống đơn giản trên GitHub theo yêu cầu của bạn cho dù bạn có muốn lưu trữ bên ngoài của mình được lưu trữ công khai hay không.

  2. Chạy bên dưới lệnh maven để triển khai cho bạn jar bên ngoài trong kho github đã tạo ở trên

    mvn deploy:deploy-file \ -DgroupId= your-group-id \ -DartifactId= your-artifact-id \ -Dversion= 1.0.0 -Dpackaging= jar -Dfile= path-to-file \ -DrepositoryId= id-to-map-on-server-section-of-settings.xml \ -Durl=https://maven.pkg.github.com/github-username/github-reponame-created-in-above-step

    Lệnh trên sẽ triển khai cho bạn jar bên ngoài trong kho GitHub được đề cập trong -Durl=. Bạn có thể tham khảo liên kết này về Cách triển khai các phụ thuộc như Hướng dẫn triển khai gói GitHub Gói GitHub

  3. Sau đó bạn có thể thêm phụ thuộc sử dụng groupId, artifactIdversionđề cập trong bước trên trong maven pom.xmlvà chạymvn install

  4. Maven sẽ lấy phụ thuộc của jar bên ngoài từ sổ đăng ký Gói GitHub và cung cấp trong dự án maven của bạn.

  5. Để làm việc này, bạn cũng sẽ cần phải định cấu hình cho bạn settings.xmlđể tìm nạp từ sổ đăng ký Gói GitHub.

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.