Làm cách nào để thêm tệp jar cục bộ vào dự án Maven?


1171

Làm cách nào để thêm tệp jar cục bộ (chưa phải là một phần của kho lưu trữ Maven) trực tiếp trong nguồn thư viện của dự án?


1
Xin chào @Praneel PIDIKITI, bạn có thể vui lòng thay đổi câu trả lời được chấp nhận thành câu trả lời có nhiều phiếu nhất không?
null

1
@nslntmnx Đó sẽ không phải là giải pháp tốt hơn, vì tất cả các giải pháp đều có nhược điểm stackoverflow.com/questions/364114/iêu
Paul Verest

Nếu libs của bạn được cập nhật hoặc mở rộng, thỉnh thoảng hãy xem câu trả lời này cho tôi muốn tải tất cả các JAR từ thư mục dự án libs của tôi với maven cho cách "pomified" và như vậy tránh một thư mục repo bổ sung và các dòng hoặc install-filelệnh cmd cồng kềnh .
GeroldBroser phục hồi Monica

Câu trả lời:


698

Cài đặt JAR vào kho lưu trữ Maven cục bộ của bạn như sau:

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

Trường hợp mỗi đề cập đến:

<path-to-file>: đường dẫn đến tệp để tải, ví dụ → c:\kaptcha-2.3.jar

<group-id>: nhóm mà tệp phải được đăng ký theo vd com.google.code

<artifact-id>: tên tạo tác cho tệp, ví dụ → kaptcha

<version>: phiên bản của tệp, ví dụ → 2.3

<packaging>: bao bì của tệp, ví dụ → jar

Tài liệu tham khảo


7
Hướng dẫn cài đặt trên bản dựng của tôi có mọi thứ trừ phần GenerPom. Điều đó dường như rất quan trọng.
Jason D

4
<đường dẫn đến tệp> có nghĩa là gì? Giống như C: /Users/XXX/WorkspaceDocx/maven/src/main/resource/myJar.jar ...... hoặc chúng ta có thể làm $ {project.basingir} ​​/src/main/resource/myJar.jar
Igor Beaufils

17
Câu trả lời không đề cập đến README hoặc các lọ được mang theo. Tuy nhiên, nếu dự án mang các lọ đi cùng thì bạn cũng có thể đặt repo vào dự án như được đề cập ở đây stackoverflow.com/a/36602256/1000011 thì bạn không cần README vì dự án sẽ chỉ hoạt động như thể các lọ đã ở trung tâm maven mà không có bất kỳ bước thủ công thêm.
quang học

8
@opticyclic bình luận của bạn cần nhiều upvote hơn, hoặc câu trả lời này cần được chỉnh sửa. Đó là một công thức cho thảm họa cho những người mới không nhận ra rằng việc cài đặt vào repo Maven địa phương sẽ không bao gồm cho những người khác.
Mike S


1430

Bạn có thể thêm phụ thuộc cục bộ trực tiếp (như được đề cập trong dự án xây dựng maven với các thư viện sở hữu được bao gồm ) như thế này:

<dependency>
    <groupId>com.sample</groupId>
    <artifactId>sample</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/src/main/resources/Name_Your_JAR.jar</systemPath>
</dependency>

Cập nhật

Trong các bản phát hành mới, tính năng này được đánh dấu là không dùng nữa nhưng vẫn hoạt động và chưa bị xóa (Bạn chỉ thấy cảnh báo trong nhật ký trong khi bắt đầu maven). Một vấn đề được nêu ra tại nhóm maven về điều này https://issues.apache.org/jira/browse/MNG-6523 (Bạn có thể tham gia và mô tả lý do tại sao tính năng này hữu ích trong một số trường hợp). Tôi hy vọng tính năng này vẫn còn đó!

Nếu bạn đang hỏi tôi, miễn là tính năng này không bị xóa, tôi sử dụng điều này để tạo sự phụ thuộc vào chỉ một tệp jar nghịch ngợm trong dự án của tôi không phù hợp với kho lưu trữ. Nếu tính năng này bị xóa, tốt, có rất nhiều câu trả lời hay ở đây mà tôi có thể chọn sau này!


49
Có những lúc bạn muốn kiểm tra cụ thể một chiếc bình cũ chẳng hạn, và tôi nghĩ câu trả lời này phù hợp với điều đó. Đó là thứ tôi cần. Được nâng cấp
John Lockwood

36
Đẹp và dễ nhìn, giải pháp này có vấn đề là yourJar.jar sẽ không được đưa vào tệp WAR cho ứng dụng của bạn.
Matthias

40
Giải pháp trên không còn hiệu quả nữa, nó trả về: "'Depencies.dependency.systemPath' cho xx.jar không nên trỏ vào các tệp trong thư mục dự án" Điều này đã được xử lý trong stackoverflow.com/questions/10935135/
sarah .ferguson

8
Trong câu trả lời này, không phải là artifactIdgroupIdcách sai?
theonlygusti

5
Theo Maven docu ( maven.apache.org/guides/int sinhtion / tên ): Lưu ý quan trọng: Điều này được đánh dấu không dùng nữa.
agassner

142

Đầu tiên, tôi muốn cung cấp tín dụng cho câu trả lời này cho một người dùng Stack Overflow ẩn danh - tôi khá chắc chắn rằng tôi đã thấy một câu trả lời tương tự ở đây trước đây - nhưng bây giờ tôi không thể tìm thấy nó.

Tùy chọn tốt nhất để có các tệp JAR cục bộ làm phụ thuộc là tạo kho lưu trữ Maven cục bộ. Một kho lưu trữ như vậy không có gì khác hơn là một cấu trúc thư mục phù hợp với các tệp pom trong đó.

Ví dụ của tôi: Tôi có dự án chính của tôi về ${master_project}vị trí và tiểu dự án1 được bật ${master_project}/${subproject1}.

Sau đó, tôi tạo một kho lưu trữ Maven trong : ${master_project}/local-maven-repo.

Trong tệp pom trong tiểu dự án1 được đặt tại ${master_project}/${subproject1}/pom.xml, kho lưu trữ cần được chỉ định sẽ lấy đường dẫn tệp làm tham số URL:

<repositories>
    <repository>
        <id>local-maven-repo</id>
        <url>file:///${project.parent.basedir}/local-maven-repo</url>
    </repository>
</repositories>

Sự phụ thuộc có thể được chỉ định như đối với bất kỳ kho lưu trữ khác. Điều này làm cho kho lưu trữ pom của bạn độc lập. Chẳng hạn, một khi JAR mong muốn có sẵn ở trung tâm Maven, bạn chỉ cần xóa nó khỏi repo cục bộ của bạn và nó sẽ được kéo từ repo mặc định.

    <dependency>
        <groupId>org.apache.felix</groupId>
        <artifactId>org.apache.felix.servicebinder</artifactId>
        <version>0.9.0-SNAPSHOT</version>
    </dependency>

Điều cuối cùng nhưng không kém phần quan trọng là thêm tệp JAR vào kho lưu trữ cục bộ bằng cách sử dụng chuyển đổi -DlocalRep repositoryPath như vậy:

mvn org.apache.maven.plugins:maven-install-plugin:2.5.2:install-file  \
    -Dfile=/some/path/on/my/local/filesystem/felix/servicebinder/target/org.apache.felix.servicebinder-0.9.0-SNAPSHOT.jar \
    -DgroupId=org.apache.felix -DartifactId=org.apache.felix.servicebinder \
    -Dversion=0.9.0-SNAPSHOT -Dpackaging=jar \
    -DlocalRepositoryPath=${master_project}/local-maven-repo

Khi tệp JAR được cài đặt, repo Maven của bạn có thể được cam kết với kho lưu trữ mã và toàn bộ thiết lập là độc lập với hệ thống. ( Ví dụ làm việc trong GitHub ).

Tôi đồng ý rằng việc các JAR cam kết repo mã nguồn không phải là một cách làm tốt, nhưng trong thực tế, các giải pháp nhanh và bẩn đôi khi tốt hơn so với một repo Nexus đầy đủ để lưu trữ một JAR mà bạn không thể xuất bản.


Thư mục tương đối cục bộ như một repo maven ... Đã giúp rất nhiều
sura2k

4
Nếu bạn muốn làm điều này trong pom.xml, hãy xem baeldung.com/install-local-jar-with-maven
Kai Wang

@Kai Wang Giải pháp này hoạt động tốt hơn! bạn có thể nên thêm điều này như một câu trả lời.
lockwobr

7
${project.parent.basedir}dường như không giải quyết được bất cứ điều gì hiện nay tôi đã sử dụng ${project.basedir}/..và làm việc hoàn hảo.
Impaler

1
Mẹo: vui lòng kiểm tra $ HOME / .m2 / settings.xml tránh "local-maven-repo" được nhân đôi bởi cài đặt / gương / gương <mirrorOf>*</mirrorOf>.
btpka3

125

Tạo một thư mục mới, giả sử local-maven-repotại thư mục gốc của dự án Maven của bạn.

Chỉ cần thêm một repo cục bộ bên trong <project>của bạn pom.xml:

<repositories>
    <repository>
        <id>local-maven-repo</id>
        <url>file:///${project.basedir}/local-maven-repo</url>
    </repository>
</repositories>

Sau đó, đối với mỗi jar bên ngoài bạn muốn cài đặt, hãy truy cập vào thư mục gốc của dự án và thực hiện:

mvn deploy:deploy-file -DgroupId=[GROUP] -DartifactId=[ARTIFACT] -Dversion=[VERS] -Durl=file:./local-maven-repo/ -DrepositoryId=local-maven-repo -DupdateReleaseInfo=true -Dfile=[FILE_PATH]

16
Đây là câu trả lời đúng duy nhất ở đây vì nó sẽ tạo repo của bạn một cách chính xác khi sử dụng triển khai.
quang học

Cách tiếp cận này sẽ hoạt động nếu mã được triển khai bằng máy chủ xây dựng CI? Có vẻ như các bản dựng tự động sẽ không có quyền truy cập vào phụ thuộc.
Wallace Howery

2
@ user2748659 có nếu trong máy chủ xây dựng CI của bạn, thư mục local-maven-repođược bao gồm (như một đứa trẻ trong ví dụ này) trong thư mục nguồn của bạn
Anthony O.

3
Câu trả lời này là những gì làm việc cho tôi. Đối với một dự án được chia sẻ, có repo trong thư mục dự án và được thêm vào kiểm soát phiên bản, đảm bảo rằng bất kỳ ai kiểm tra dự án sẽ không bị thiếu phụ thuộc. Nếu bạn có nhiều phụ thuộc, thì một repo từ xa được chia sẻ có lẽ là một giải pháp tốt hơn, nếu không thì việc giữ lại repo trong thư mục của dự án là hoàn toàn tốt.
Aquarelle

2
Lưu ý rằng để làm điều này, bạn có thể cần thêm -Dpackaging = jar. Nếu không, bạn nhận được "thông tin giả tạo không đầy đủ hoặc không hợp lệ: bao bì bị thiếu".
J Woodchuck

43

Tôi muốn giải pháp như vậy - sử dụng maven-install-plugintrong tệp pom:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-install-plugin</artifactId>
    <version>2.5.2</version>
    <executions>
        <execution>
            <phase>initialize</phase>
            <goals>
                <goal>install-file</goal>
            </goals>
            <configuration>
                <file>lib/yourJar.jar</file>
                <groupId>com.somegroup.id</groupId>
                <artifactId>artefact-id</artifactId>
                <version>x.y.z</version>
                <packaging>jar</packaging>
            </configuration>
        </execution>
    </executions>
</plugin>

Trong trường hợp này, bạn có thể thực hiện mvn initializevà jar sẽ được cài đặt trong repo maven cục bộ. Bây giờ bình này có sẵn trong bất kỳ bước maven nào trên máy này (đừng quên bao gồm phụ thuộc này như bất kỳ phụ thuộc maven nào khác trong pom với <dependency></dependency>thẻ). Cũng có thể liên kết cài đặt jar không theo initializetừng bước, nhưng bất kỳ bước nào khác bạn muốn.


2
Điều này hoạt động tốt với tôi, nhưng chỉ khi tôi chạy mvn initializetrước mvn package: tôi không thể mvn initialize packagetải xuống JAR từ repo trung tâm. Tại sao lại thế này? Tôi nghĩ rằng nó sẽ chạy các mục tiêu / giai đoạn này theo thứ tự.
DavidS

1
Trên thực tế, chúng nên được chạy theo thứ tự. Hãy xem danh sách vòng đời mặc định: maven.apache.org/guides/int sinhtion / Lỗi Bạn có thể sử dụng một bước khác để liên kết.
sphinks

2
Tôi đã thử mọi phương pháp, nhưng cuối cùng tôi đã phải dùng đến giải pháp này. Lý do chính là, tôi muốn có thể xây dựng các gói trong chế độ ngoại tuyến. Nếu tôi tuyên bố nó là một phụ thuộc với kho lưu trữ được xác định cục bộ, thì đây luôn được coi là một repo trực tuyến khác và bản dựng maven phàn nàn về việc không phạt tiền giả. Giải pháp này hoạt động tốt cho mọi trường hợp.
Mauli

2
Tôi nghĩ sẽ tốt hơn khi sử dụng pha sạch vì việc khởi tạo sẽ được thực thi mỗi khi chúng tôi sử dụng gói mvn khi không cần thiết. Cuối cùng, nếu chúng ta chỉ cần tạo jar / war, chúng ta có thể sử dụng gói sạch mvn trực tiếp .
Deoxyseia

" Cũng có thể liên kết cài đặt jar không khởi tạo bước, nhưng bất kỳ bước nào khác bạn thích. " Không nhất thiết phải đúng. Nếu phụ thuộc chưa có trong repo và một pha được sử dụng xuất hiện sau một pha giải quyết các phụ thuộc (ví dụ compile), bản dựng sẽ thất bại.
GeroldBroser phục hồi Monica

29
<dependency>
    <groupId>group id name</groupId>
    <artifactId>artifact name</artifactId>
    <version>version number</version>
    <scope>system</scope>
    <systemPath>jar location</systemPath>
</dependency>

6
<scope>systembây giờ không được dùng nữa
GeroldBroser phục hồi Monica

@GeroldBroser - ok. những gì chúng ta có thể sử dụng thay vì đó?
MasterJoe2

2
@ MasterJoe2 Như đã đề cập trong câu trả lời được chấp nhận install:install-file , tạo tác cho repo cục bộ và sử dụng nó như một phụ thuộc "bình thường" (với phạm vi mặc định compile) hoặc sử dụng giải pháp kho lưu trữ trong dự án .
GeroldBroser phục hồi Monica


14

Cách thực sự nhanh chóng và bẩn thỉu là trỏ đến một tệp cục bộ:

<dependency>
      <groupId>sample</groupId>  
       <artifactId>com.sample</artifactId>  
       <version>1.0</version> 
      <scope>system</scope>
      <systemPath>C:\DEV\myfunnylib\yourJar.jar</systemPath>
</dependency>

Tuy nhiên, điều này sẽ chỉ tồn tại trên máy của bạn (rõ ràng), vì chia sẻ thường nên sử dụng một kho lưu trữ m2 thích hợp (nexus / artifactory) hoặc nếu bạn không có bất kỳ thứ nào trong số này hoặc không muốn thiết lập một maven cục bộ lưu trữ có cấu trúc và cấu hình một "kho lưu trữ" trong pom của bạn: local:

<repositories>
    <repository>
        <id>my-local-repo</id>
        <url>file://C:/DEV//mymvnrepo</url>
    </repository>
</repositories>

Xa xôi:

<repositories>
    <repository>
        <id>my-remote-repo</id>
        <url>http://192.168.0.1/whatever/mavenserver/youwant/repo</url>
    </repository>
</repositories>

đối với điều này, một đường dẫn tương đối cũng có thể sử dụng biến dựa trên:

<url>file:${basedir}</url>

Đối với các URL kho lưu trữ cục bộ, chúng có thể là tương đối hay chúng phải tuyệt đối?
Dragas

@Dragas Tôi chưa thử, xin vui lòng cho chúng tôi biết nếu bạn đã làm.
fl0w

1
Vâng, rõ ràng bạn cần sử dụng <url>file:${basedir}</url>làm url cơ sở thay thế.
Dragas

11

Thêm JAR cục bộ của riêng bạn trong tệp POM và sử dụng nó trong maven build.

mvn install:install-file -Dfile=path-to-jar -DgroupId=owngroupid -DartifactId=ownartifactid -Dversion=ownversion -Dpackaging=jar

Ví dụ:

mvn install:install-file -Dfile=path-to-jar -DgroupId=com.decompiler -DartifactId=jd-core-java -Dversion=1.2 -Dpackaging=jar

Sau đó thêm nó vào POM như thế này:

nhập mô tả hình ảnh ở đây


Tôi gặp lỗi Không thể cài đặt tạo tác (truy cập bị từ chối). Làm sao tôi có thể giải quyết việc này? @Aurasphere
Ramzah Rehman

1
@RamzahRehman thử mở dấu nhắc lệnh với đặc quyền admi bằng cách nhấp chuột phải vào nó và sau đó chọn "Chạy với tư cách quản trị viên"
Aurasphere

9

Một cách là tải nó lên trình quản lý kho lưu trữ Maven của riêng bạn (chẳng hạn như Nexus). Đó là một thực hành tốt để có một người quản lý kho lưu trữ riêng.

Một cách hay khác mà tôi đã thấy gần đây là đưa Plugin cài đặt Maven vào vòng đời xây dựng của bạn: Bạn khai báo trong POM để cài đặt các tệp vào kho lưu trữ cục bộ. Đó là một ít nhưng nhỏ trên đầu và không có bước thủ công liên quan.

http://maven.apache.org/plugins/maven-install-plugin/install-file-mojo.html


4
Kết thúc với việc chuyển sang lớp. Nó không hoạt động Nếu jar cục bộ được xác định là phụ thuộc, maven sẽ không thực thi các plugin trước khi giải quyết các phụ thuộc, việc cài đặt thủ công là không thể tránh khỏi. tìm thấy một sự khó chịu về tình huống này: stackoverflow.com/questions/5951999/iêu
xinthink 15/03/2015


6

Một trường hợp thú vị khác là khi bạn muốn có trong các lọ maven riêng của dự án. Bạn có thể muốn giữ các khả năng của Maven để giải quyết các phụ thuộc bắc cầu. Giải pháp khá dễ dàng.

  1. Tạo một thư mục libs trong dự án của bạn
  2. Thêm các dòng sau vào tệp pom.xml của bạn

    <properties><local.repository.folder>${pom.basedir}/libs/</local.repository.folder>
    </properties>
    
    <repositories>
       <repository>
            <id>local-maven-repository</id>
            <url>file://${local.repository.folder}</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
       </repository>
    </repositories>
  3. Mở thư mục .m2 / repository và sao chép cấu trúc thư mục của dự án bạn muốn nhập vào thư mục libs .

Ví dụ: giả sử bạn muốn nhập phụ thuộc

<dependency>
    <groupId>com.mycompany.myproject</groupId>
    <artifactId>myproject</artifactId>
    <version>1.2.3</version>
</dependency>

Cứ đi tiếp .m2 / repository và bạn sẽ thấy thư mục sau

com / mycompany / myproject / 1.2.3

Sao chép mọi thứ trong thư mục libs của bạn (một lần nữa, bao gồm các thư mục trong .m2 / repository ) và bạn đã hoàn tất.


6

dòng lệnh :

mvn install:install-file -Dfile=c:\kaptcha-{version}.jar -DgroupId=com.google.code
-DartifactId=kaptcha -Dversion={version} -Dpackaging=jar

5

Phần quan trọng trong sự phụ thuộc là: $ {pom.basingir} (thay vì chỉ $ {Dựair})

<dependency>
    <groupId>org.example</groupId>
    <artifactId>example</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${pom.basedir}/src/lib/example.jar</systemPath>
</dependency>

4

Tôi nghĩ rằng một giải pháp tốt hơn cho vấn đề này là sử dụng maven-install-plugin để tự động cài đặt các tệp khi cài đặt. Đây là cách tôi thiết lập nó cho dự án của tôi.

Đầu tiên, thêm đường dẫn (nơi bạn lưu trữ .jars cục bộ) làm tài sản.

<properties>
    <local.sdk>/path/to/jar</local.sdk>
</properties>

Sau đó, bên dưới pluginsthêm một plugin để cài đặt các lọ khi biên dịch.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-install-plugin</artifactId>
    <version>2.5.2</version>
    <executions>
        <execution>
            <id>1</id>
            <phase>initialize</phase>
            <goals>
                <goal>install-file</goal>
            </goals>
            <configuration>
                <groupId>com.local.jar</groupId> 
                <artifactId>appengine-api</artifactId>
                <version>1.0</version>
                <packaging>jar</packaging>
                <file>${local.sdk}/lib/impl/appengine-api.jar</file>
            </configuration>
        </execution>
        <execution>
            <id>appengine-api-stubs</id>
            <phase>initialize</phase>
            <goals>
                <goal>install-file</goal>
            </goals>
            <configuration>
                <groupId>com.local.jar</groupId>
                <artifactId>appengine-api-stubs</artifactId>
                <version>1.0</version>
                <packaging>jar</packaging>
                <file>${local.sdk}/lib/impl/appengine-api-stubs.jar</file>
            </configuration>
        </execution>
    </executions>
</plugin>

Cuối cùng, trong phần phụ thuộc, bạn có thể thêm các lọ

<dependency>
    <groupId>com.local.jar</groupId>
    <artifactId>appengine-api</artifactId>
    <version>1.0</version>
</dependency>

<dependency>
    <groupId>com.local.jar</groupId>
    <artifactId>appengine-api-stubs</artifactId>
    <version>1.0</version>
    <scope>test</scope>
</dependency>

Bằng cách thiết lập dự án của bạn như thế này, dự án sẽ tiếp tục xây dựng ngay cả khi bạn đưa nó đến một máy tính khác (với điều kiện là nó có tất cả các tệp jar trong đường dẫn được chỉ định bởi thuộc tính local.sdk).

Dành cho groupId sử dụng một tên duy nhất chỉ để đảm bảo rằng không có xung đột.

Bây giờ khi bạn mvn installhoặc mvn testlọ địa phương sẽ được thêm tự động.


3

Cách ưa thích sẽ là tạo kho lưu trữ từ xa của riêng bạn.

Xem ở đây để biết chi tiết về cách làm điều đó. Hãy xem phần ' Tải lên kho lưu trữ từ xa '.


3

Tôi muốn chia sẻ một mã nơi bạn có thể tải lên một thư mục chứa đầy các lọ. Nó hữu ích khi nhà cung cấp không có kho lưu trữ công cộng và bạn cần thêm nhiều thư viện theo cách thủ công. Tôi đã quyết định xây dựng một .bat thay vì gọi trực tiếp đến maven vì nó có thể bị lỗi Bộ nhớ. Nó đã được chuẩn bị cho môi trường windows nhưng rất dễ thích ứng với hệ điều hành linux:

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.jar.Attributes;
import java.util.jar.JarFile;
import java.util.jar.Manifest;

public class CreateMavenRepoApp {

    private static final String OCB_PLUGIN_FOLDER = "C://your_folder_with_jars";

    public static void main(String[] args) throws IOException {

    File directory = new File();
    //get all the files from a directory
    PrintWriter writer = new PrintWriter("update_repo_maven.bat", "UTF-8");
    writer.println("rem "+ new Date());  
    File[] fList = directory.listFiles();
    for (File file : fList){
        if (file.isFile()){               
        String absolutePath = file.getAbsolutePath() ;
        Manifest  m = new JarFile(absolutePath).getManifest();
        Attributes attributes = m.getMainAttributes();
        String symbolicName = attributes.getValue("Bundle-SymbolicName");

        if(symbolicName!=null &&symbolicName.contains("com.yourCompany.yourProject")) {
            String[] parts =symbolicName.split("\\.");
            String artifactId = parts[parts.length-1];
            String groupId = symbolicName.substring(0,symbolicName.length()-artifactId.length()-1);
            String version = attributes.getValue("Bundle-Version");
            String mavenLine= "call mvn org.apache.maven.plugins:maven-install-plugin:2.5.1:install-file -Dfile="+ absolutePath+" -DgroupId="+ groupId+" -DartifactId="+ artifactId+" -Dversion="+ version+" -Dpackaging=jar ";
            writer.println(mavenLine);          
        }

        }
    }
    writer.close();
    }

}

Sau khi chạy main này từ bất kỳ IDE nào, hãy chạy update_Vpo_maven.bat.


Mã của bạn String symbolicName = attributes.getValue("Bundle-SymbolicName"); if(symbolicName!=null &&symbolicName.contains("com.yourCompany.yourProject"))dường như chỉ ra rằng chỉ các lọ tùy chỉnh sẽ được hỗ trợ. Đó không phải là những gì chúng ta cần: thay vào đó là một loạt các lọ của bên thứ ba. Bạn có gợi ý làm thế nào để cài đặt bất kỳ jar theo cách này?
javadba

Tôi đã sửa mã của bạn: tôi đặt câu trả lời ở phía dưới.
javadba

3

Đây là một cú pháp ngắn cho các phiên bản mới hơn:

mvn install:install-file -Dfile=<path-to-file>

Nó hoạt động khi JAR được xây dựng bởi Apache Maven - trường hợp phổ biến nhất. Sau đó, nó sẽ chứa một tệp pom.xml trong thư mục con của thư mục META-INF, sẽ được đọc theo mặc định.

Nguồn: http://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html


2

Ngoài ra hãy xem ...

<scope>compile</scope>

Phụ thuộc Maven . Đây là mặc định nhưng tôi đã tìm thấy trong một số trường hợp cài đặt rõ ràng phạm vi đó cũng là Maven để tìm các thư viện cục bộ trong kho lưu trữ cục bộ.


2

Vì một số lý do, trong ứng dụng web tôi đang bảo trì, cả giải pháp của Alireza Fattahi lẫn giải pháp của JJ Roman hoạt động chính xác. Trong cả hai trường hợp, quá trình biên dịch đều ổn (nó nhìn thấy bình), nhưng bao bì không bao gồm bình trong cuộc chiến.

Cách duy nhất tôi quản lý để làm cho nó hoạt động là bằng cách đặt bình lên /src/main/webapp/WEB-INF/lib/và sau đó kết hợp nó với giải pháp của Fattahis hoặc Roman.


1

Lưu ý rằng KHÔNG nhất thiết phải sử dụng repo cục bộ. Nếu dự án này được chia sẻ với những người khác thì mọi người khác sẽ gặp vấn đề và câu hỏi khi nó không hoạt động và jar sẽ không khả dụng ngay cả trong hệ thống kiểm soát nguồn của bạn!

Mặc dù repo được chia sẻ là câu trả lời tốt nhất, nhưng nếu bạn không thể làm điều này vì một số lý do thì nhúng bình sẽ tốt hơn so với repo cục bộ. Nội dung repo chỉ cục bộ có thể gây ra nhiều vấn đề, đặc biệt là theo thời gian.


1
nếu bạn thêm các tệp trong hệ thống kiểm soát nguồn, các thư viện sẽ luôn có sẵn cùng với nguồn. Không có nguồn, không có thư viện. Với maven thay vào đó nguồn có thể ổn nhưng kho lưu trữ không có sẵn.
sarah.ferguson

@Frank ... có ý tưởng nào về cách tạo jar thực thi mà không bao gồm các phụ thuộc bên ngoài (tệp thư viện) không?
Satish Karuturi

Đối với một người mới biết về maven và đang tìm câu trả lời cho câu hỏi ban đầu, "nhúng bình" có nghĩa là gì?
cdock

1

Trên kho lưu trữ cục bộ của bạn, bạn có thể cài đặt jar của mình bằng cách ban hành các lệnh

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

Theo liên kết hữu ích này để làm tương tự từ trang web của mkyoung. Bạn cũng có thể kiểm tra hướng dẫn maven cho cùng


1

Để cài đặt jar của bên thứ ba, vui lòng gọi lệnh như bên dưới

mvn install:install-file -DgroupId= -DartifactId= -Dversion= -Dpackaging=jar -Dfile=path

1
  1. cài đặt mvn

Bạn có thể viết mã bên dưới trong dòng lệnh hoặc nếu bạn đang sử dụng nhật thực dựng sẵn, nhấp chuột phải vào dự án -> Chạy dưới dạng -> chạy cấu hình ... -> trong bảng điều khiển bên trái nhấp chuột phải vào Maven Build -> cấu hình mới -> viết mã trong Mục tiêu & trong thư mục cơ sở: $ {project_loc: NameOfYourProject} -> Run

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

Trường hợp mỗi đề cập đến:

<path-to-file>: đường dẫn đến tệp cần tải, ví dụ:> c: \ kaptcha-2.3.jar

<group-id>: nhóm mà tệp phải được đăng ký trong ví dụ:> com.google.code

<artifact-id>: tên tạo tác cho tệp, vd -> kaptcha

<phiên bản>: phiên bản của tệp, ví dụ:> 2.3

<bao bì>: bao bì của tệp, ví dụ:> jar

2.Sau khi cài đặt, chỉ cần khai báo jar trong pom.xml.

 <dependency>
      <groupId>com.google.code</groupId>
      <artifactId>kaptcha</artifactId>
      <version>2.3</version>
 </dependency>

1

Bước 1: Định cấu hình maven-install-pluginvới mục tiêu install-filetrong của bạnpom.xml

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-install-plugin</artifactId>
    <executions>
        <execution>
            <id>install-external-non-maven-jar-MWS-Client-into-local-maven-repo</id>
            <phase>clean</phase>
            <configuration>
                <repositoryLayout>default</repositoryLayout>
                <groupId>com.amazonservices.mws</groupId>
                <artifactId>mws-client</artifactId>
                <version>1.0</version>
                <file>${project.basedir}/lib/MWSClientJavaRuntime-1.0.jar</file>
                <packaging>jar</packaging>
                <generatePom>true</generatePom>
            </configuration>
            <goals>
                <goal>install-file</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Đảm bảo chỉnh sửa fileđường dẫn dựa trên đường dẫn tệp thực tế của bạn (khuyến nghị là đặt các lọ không phải là maven bên ngoài này vào một số thư mục, giả sử libvà đặt cái nàylib thư mục trong dự án của bạn để sử dụng đường dẫn tương đối dành riêng cho dự án và tránh thêm hệ thống đường dẫn tuyệt đối cụ thể.

Nếu bạn có nhiều lọ bên ngoài, chỉ cần lặp lại <execution>cho các lọ khác trong cùng maven-install-plugin.

Bước 2: Khi bạn đã định cấu hình maven-install-pluginnhư được hiển thị ở trên trong pom.xmltệp của mình , bạn phải sử dụng các lọ này trong pom.xmlbình thường:

    <dependency>
        <groupId>com.amazonservices.mws</groupId>
        <artifactId>mws-client</artifactId>
        <version>1.0</version>
    </dependency>

Lưu ý rằng maven-install-pluginchỉ sao chép các lọ bên ngoài của bạn vào địa phương của bạn.m2 kho lưu trữ maven . Đó là nó. Nó không tự động bao gồm các lọ này như phụ thuộc maven cho dự án của bạn.

Đó là một điểm nhỏ, nhưng đôi khi dễ bỏ lỡ.


0

Tôi đã có cùng một lỗi cho một tập hợp các phụ thuộc trong pom.xml của tôi, hóa ra các phiên bản của các phụ thuộc không được chỉ định trong pom.xml và đã được đề cập trong kho lưu trữ mẹ. Vì một số lý do, các chi tiết phiên bản không được đồng bộ hóa với repo này. Do đó tôi đã nhập thủ công các phiên bản bằng cách sử dụng thẻ và nó hoạt động như một lá bùa. Một chút thời gian cần thiết để tra cứu các phiên bản trong phần gốc và chỉ định ở đây. Nhưng điều này có thể được thực hiện chỉ đối với các lọ đang hiển thị lỗi artifactid và nó hoạt động. Hy vọng điều này sẽ giúp được ai đó.


0

Trong Apache Maven 3.5.4, tôi đã phải thêm trích dẫn kép. Không có trích dẫn kép, nó đã không làm việc cho tôi.

ví dụ: mvn install: install-file "-Dfile = location vào tệp jar" "-DgroupId = nhóm id" "-DartifactId = artifact id" "-Dversion = version" "-Dpackaging = kiểu gói"


0
  1. Tạo một thư mục kho lưu trữ Maven cục bộ, gốc dự án của bạn sẽ trông giống như thế này để bắt đầu:
yourproject
+- pom.xml
+- src
  1. Thêm thư mục kho lưu trữ Maven tiêu chuẩn được gọi là repo cho nhóm com.example và phiên bản 1.0:
yourproject
+- pom.xml
+- src
+- repo
  1. Triển khai Artifact vào Repo, Maven có thể triển khai tạo phẩm cho bạn bằng cách sử dụng mvn triển khai: triển khai tệp mục tiêu:
mvn deploy:deploy-file -Durl=file:///pathtoyour/repo -Dfile=your.jar -DgroupId=your.group.id -DartifactId=yourid -Dpackaging=jar -Dversion=1.0
  1. cài đặt tệp pom tương ứng với jar của bạn để dự án của bạn có thể tìm thấy jar trong quá trình xây dựng maven từ repo cục bộ:
mvn install:install-file -Dfile=/path-to-your-jar-1.0.jar -DpomFile=/path-to-your-pom-1.0.pom
  1. thêm repo trong tập tin pom của bạn:
<repositories>
    <!--other repositories if any-->
    <repository>
        <id>project.local</id>
        <name>project</name>
        <url>file:${project.basedir}/repo</url>
    </repository>
</repositories>
  1. thêm sự phụ thuộc trong pom của bạn:
<dependency>
    <groupId>com.groupid</groupId>
    <artifactId>myid</artifactId>
    <version>1.0</version>
</dependency>

-2

TRẢ LỜI NÀY CHỈ DÀNH CHO NGƯỜI SỬ DỤNG ECLIPSE:

Nếu bạn đang sử dụng Eclipse, hãy đặt jar trong lib /, nhấp chuột phải vào tên jar và nhấp vào "thêm để xây dựng đường dẫn". Eclipse sẽ tạo ra một "thư viện tham chiếu" và đặt jar cho bạn

Nó giải quyết việc nhập bình ngay lập tức trong chương trình cho tôi


5
Điều đó sẽ thêm mục nhập vào Eclipse .classpath, nhưng bản dựng maven của bạn mvn packagesẽ được giới thiệu một khi bạn bắt đầu sử dụng sự phụ thuộc đó, vì maven không có định nghĩa về nó, và nó chỉ nên có trongpom.xml
Paul Verest

vâng, bạn nói đúng, gói sẽ không bao gồm bình địa phương. Nhưng tôi đã trả lời cho câu hỏi, làm thế nào để thêm nó vào một dự án (theo cách nhật thực).
Anandkumar
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.