Tôi có thể thêm bình vào maven 2 build classpath mà không cần cài đặt chúng không?


700

Maven2 đang khiến tôi phát điên trong giai đoạn phát triển thử nghiệm / nhanh chóng và bẩn thỉu.

Tôi có một pom.xmltệp xác định các phụ thuộc cho khung ứng dụng web mà tôi muốn sử dụng và tôi có thể nhanh chóng tạo các dự án khởi động từ tệp đó. Tuy nhiên, đôi khi tôi muốn liên kết đến thư viện của bên thứ 3 chưa có pom.xmltệp được xác định, vì vậy thay vì tạo pom.xmltệp cho lib của bên thứ 3 bằng tay và cài đặt nó, và thêm phụ thuộc vào tôi pom.xml, tôi chỉ muốn để nói với Maven: "Ngoài các phụ thuộc được xác định của tôi, bao gồm bất kỳ lọ nào cũng /libvậy."

Có vẻ như điều này nên đơn giản, nhưng nếu có, tôi đang thiếu một cái gì đó.

Bất kỳ con trỏ về cách làm điều này được đánh giá rất cao. Nói tóm lại, nếu có một cách đơn giản để trỏ maven vào một /libthư mục và dễ dàng tạo một pom.xmlvới tất cả các lọ được đính kèm được ánh xạ tới một phụ thuộc duy nhất mà sau đó tôi có thể đặt tên / cài đặt và liên kết đến trong một cú trượt cũng sẽ đủ.


Nếu bạn đang sử dụng Netbeans, chỉ cần làm theo các bước sau: [Làm cách nào để tôi cài đặt các mô-đun vào kho lưu trữ maven bằng cách sử dụng Netbeans nhúng Maven?] [1] [1]: stackoverflow.com/a/339874/530153
Rajat Gupta

1
Tôi muốn chỉ ra rằng liên kết này stackoverflow.com/a/339874/530153 dường như hoạt động để cài đặt các lọ một lần.
Paul

Câu trả lời:


600

Vấn đề của phương pháp phổ biến

Hầu hết các câu trả lời bạn sẽ tìm thấy trên internet sẽ đề nghị bạn cài đặt phần phụ thuộc vào kho lưu trữ cục bộ của bạn hoặc chỉ định phạm vi "hệ thống" trong pomvà phân phối phần phụ thuộc với nguồn dự án của bạn. Nhưng cả hai giải pháp này đều thực sự thiếu sót.

Tại sao bạn không nên áp dụng phương pháp "Cài đặt vào Repo cục bộ"

Khi bạn cài đặt một phụ thuộc vào kho lưu trữ cục bộ của bạn, nó vẫn ở đó. Cổ vật phân phối của bạn sẽ hoạt động tốt miễn là nó có quyền truy cập vào kho lưu trữ này. Vấn đề là trong hầu hết các trường hợp, kho lưu trữ này sẽ nằm trên máy cục bộ của bạn, vì vậy sẽ không có cách nào để giải quyết sự phụ thuộc này vào bất kỳ máy nào khác. Rõ ràng làm cho tạo tác của bạn phụ thuộc vào một máy cụ thể không phải là một cách để xử lý mọi thứ. Nếu không, sự phụ thuộc này sẽ phải được cài đặt cục bộ trên mỗi máy làm việc với dự án đó, điều này không tốt hơn.

Tại sao bạn không nên áp dụng phương pháp "Phạm vi hệ thống"

Các lọ bạn phụ thuộc vào cách tiếp cận "Phạm vi hệ thống" không được cài đặt vào bất kỳ kho lưu trữ nào hoặc được đính kèm với các gói mục tiêu của bạn. Đó là lý do tại sao gói phân phối của bạn sẽ không có cách giải quyết sự phụ thuộc đó khi được sử dụng. Điều đó tôi tin là lý do tại sao việc sử dụng phạm vi hệ thống thậm chí còn bị phản đối. Dù sao, bạn không muốn dựa vào một tính năng không dùng nữa.

Giải pháp kho lưu trữ trong dự án tĩnh

Sau khi đặt cái này vào pom:

<repository>
    <id>repo</id>
    <releases>
        <enabled>true</enabled>
        <checksumPolicy>ignore</checksumPolicy>
    </releases>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
    <url>file://${project.basedir}/repo</url>
</repository>

đối với mỗi tạo phẩm có id nhóm có dạng x.y.zMaven sẽ bao gồm vị trí sau trong thư mục dự án của bạn để tìm kiếm các tạo phẩm:

repo/
| - x/
|   | - y/
|   |   | - z/
|   |   |   | - ${artifactId}/
|   |   |   |   | - ${version}/
|   |   |   |   |   | - ${artifactId}-${version}.jar

Để giải thích thêm về điều này, bạn có thể đọc bài viết trên blog này .

Sử dụng Maven để cài đặt để dự án repo

Thay vì tạo cấu trúc này bằng tay, tôi khuyên bạn nên sử dụng plugin Maven để cài đặt các lọ của bạn dưới dạng tạo tác. Vì vậy, để cài đặt một tạo phẩm vào kho lưu trữ trong dự án trong repothư mục thực thi:

mvn install:install-file -DlocalRepositoryPath=repo -DcreateChecksum=true -Dpackaging=jar -Dfile=[your-jar] -DgroupId=[...] -DartifactId=[...] -Dversion=[...]

Nếu bạn chọn phương pháp này, bạn sẽ có thể đơn giản hóa khai báo kho lưu trữ trong pom:

<repository>
    <id>repo</id>
    <url>file://${project.basedir}/repo</url>
</repository>

Một kịch bản trợ giúp

Do việc thực thi lệnh cài đặt cho mỗi lib khá khó chịu và dễ bị lỗi, tôi đã tạo một tập lệnh tiện ích tự động cài đặt tất cả các tệp từ libthư mục vào kho lưu trữ dự án, trong khi tự động giải quyết tất cả siêu dữ liệu (groupId, artifactId và v.v.) từ tên của các tập tin. Kịch bản cũng in ra các phụ thuộc xml để bạn sao chép-dán vào pom.

Bao gồm các phụ thuộc trong gói mục tiêu của bạn

Khi bạn có kho lưu trữ trong dự án của mình, bạn sẽ giải quyết được vấn đề phân phối các phụ thuộc của dự án với nguồn của nó, nhưng kể từ đó, tạo phẩm mục tiêu của dự án của bạn sẽ phụ thuộc vào các tệp không được xuất bản, vì vậy khi bạn cài đặt nó vào một kho lưu trữ nó sẽ có các phụ thuộc không thể giải quyết được.

Để đánh bại vấn đề này, tôi đề nghị đưa các phụ thuộc này vào gói mục tiêu của bạn. Điều này bạn có thể làm với Plugin hội hoặc tốt hơn với Plugin OneJar . Tài liệu chính thức về OneJar rất dễ nắm bắt.


3
Tôi luôn cho rằng bạn có thể tạo một kho lưu trữ trong dự án, cuối cùng đã xác nhận nó, thật tuyệt!
albfan

19
Hai điều cần lưu ý: 1) Tôi khuyên bạn nên sử dụng "$ {project.baseUri} repo" thay vì "file: // $ {project.basingir} ​​/ repo" để nhận url tương thích với RFC trên Windows. 2) Nếu bạn cấu trúc dự án của mình thành các mô hình con, cách tiếp cận này dường như thất bại vì $ {project.baseUri} được giải quyết cho thư mục con của mô-đun. Bất kỳ ý tưởng làm thế nào để giải quyết vấn đề này?
Oliver Hanappi

8
Điều này gần như đã đưa tôi đến đó - nhưng kịch bản của Nikita đã cố gắng quá thông minh với các tệp JAR được đặt tên xấu mà tôi có. Vì vậy, tôi đã tạo một phiên bản đơn giản hóa mà không thực hiện bất kỳ dự đoán nào cho nhómId: github.com/carchrae/install-to-project-repo
Tom Carchrae

3
thật là một câu trả lời xuất sắc !! Có 2 cách để làm một cái gì đó, đúng cách và cách làm việc, bạn ạ làm đúng cách!
Panthro

1
tại đây bạn cũng tìm thấy thông tin về cách tự động tạo ra tạo phẩm từ tệp jar của bạn: devcenter.heroku.com/articles/local-maven-dependencies
Dirk

485

Chỉ để vứt mã

đặt phạm vi == hệ thống và chỉ tạo một nhómId, artifactId và phiên bản

<dependency>
    <groupId>org.swinglabs</groupId>
    <artifactId>swingx</artifactId>
    <version>0.9.2</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/swingx-0.9.3.jar</systemPath>
</dependency>

Lưu ý: các phụ thuộc hệ thống không được sao chép vào jar / war kết quả
(xem Cách bao gồm các phụ thuộc hệ thống trong chiến tranh được xây dựng bằng maven )


4
Cảm ơn điều này thực sự gần với những gì tôi muốn. Bất kỳ cách nào để thêm tất cả chúng như là một mục duy nhất? Nói rằng tôi có / lib với 10 lọ, tôi có thể thêm tất cả chúng bằng cách nào đó, ví dụ với /some/path/*.jar cho systemPath không? hoặc tôi vẫn phải coi mỗi người là một phụ thuộc đã biết? Tuy nhiên, thực sự gần với những gì tôi cần, cảm ơn!

11
sử dụng systemPath như thế này: "<systemPath> $ {Dựair} /lib/BrowserLauncher2-1_3.jar </ systemPath>" $ {Dựair} đang trỏ đến gốc của dự án của bạn.
Frederic Morin

4
Nó là tốt hơn để sử dụng dự án. tiền tố trong đường dẫn của bạn như vậy: <systemPath> $ {project.basingir} ​​/lib/Aw đũaLib.jar </ systemPath>
Matthew McCullough

76
Mặc dù tôi hiểu rằng đây là những gì OP yêu cầu, tôi vẫn muốn nhấn mạnh rằng sử dụng một systemphạm vi là một thực tế khủng khiếp được khuyến khích mạnh mẽ . Xem Phụ thuộc + Phạm vi .
Pascal Thivent

6
@marioosh hãy nhớ mục đích ban đầu của câu hỏi là để thử nghiệm nhanh. Nếu bạn muốn làm một gói mvn, hãy cài đặt jar vào repo.
Pyrolistic

63

Bạn có thể tạo kho lưu trữ cục bộ trên dự án của bạn

Ví dụ: nếu bạn có libsthư mục trong cấu trúc dự án

  • Trong libsthư mục bạn nên tạo cấu trúc thư mục như:/groupId/artifactId/version/artifactId-version.jar

  • Trong tệp pom.xml của bạn, bạn nên đăng ký kho lưu trữ

    <repository>
        <id>ProjectRepo</id>
        <name>ProjectRepo</name>
        <url>file://${project.basedir}/libs</url>
    </repository>
  • và thêm phụ thuộc như bình thường

    <dependency>
        <groupId>groupId</groupId>
        <artifactId>artifactId</artifactId>
        <version>version</version>
    </dependency>

Đó là tất cả.

Để biết thông tin chi tiết: Cách thêm thư viện bên ngoài trong Maven


1
Bạn trả lời là gần như đúng. GroupId nên được chia thành các thư mục con máy chủ.
Peter Fortuin

5
Tất nhiên, nếu bạn có nhóm phức tạp như 'com.foo.bar' thì cấu trúc thư mục của bạn phải là /com/foo/bar/artifactId/version/artifactId-verion.jar
Dmytro Boichenko

Điều này có khác biệt đáng kể so với câu trả lời là một năm trước không?
Joshua Taylor

Trong thư mục cuối cùng, nơi đặt tệp jar, bạn cũng cần thêm tệp pom xml có liên quan.
Federico

30

Lưu ý: Khi sử dụng phạm vi Hệ thống ( như được đề cập trên trang này ), Maven cần các đường dẫn tuyệt đối.

Nếu các lọ của bạn nằm dưới gốc của dự án, bạn sẽ muốn tiền tố các giá trị systemPath của bạn bằng $ {Dựair}.


15

Đây là những gì tôi đã làm, nó cũng hoạt động xung quanh vấn đề gói và nó hoạt động với mã đã kiểm tra.

Tôi đã tạo một thư mục mới trong dự án trong trường hợp tôi đã sử dụng repo, nhưng cứ thoải mái sử dụngsrc/repo

Trong POM của tôi, tôi đã có một sự phụ thuộc không có trong bất kỳ kho lưu trữ công khai nào

<dependency>
    <groupId>com.dovetail</groupId>
    <artifactId>zoslog4j</artifactId>
    <version>1.0.1</version>
    <scope>runtime</scope>
</dependency>

Sau đó tôi đã tạo các thư mục sau repo/com/dovetail/zoslog4j/1.0.1và sao chép tệp JAR vào thư mục đó.

Tôi đã tạo tệp POM sau để thể hiện tệp đã tải xuống (bước này là tùy chọn, nhưng nó sẽ xóa CẢNH BÁO) và giúp người tiếp theo tìm ra nơi tôi bắt đầu tệp.

<?xml version="1.0" encoding="UTF-8" ?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.dovetail</groupId>
    <artifactId>zoslog4j</artifactId>
    <packaging>jar</packaging>
    <version>1.0.1</version>
    <name>z/OS Log4J Appenders</name>
    <url>http://dovetail.com/downloads/misc/index.html</url>
    <description>Apache Log4j Appender for z/OS Logstreams, files, etc.</description>
</project>

Hai tệp tùy chọn tôi tạo là tổng kiểm tra SHA1 cho POM và JAR để xóa các cảnh báo tổng kiểm tra bị thiếu.

shasum -b < repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.jar \
          > repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.jar.sha1

shasum -b < repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.pom \
          > repo/com/dovetail/zoslog4j/1.0.1/zoslog4j-1.0.1.pom.sha1

Cuối cùng tôi thêm đoạn sau vào pom.xml của mình, cho phép tôi tham khảo kho lưu trữ cục bộ

<repositories>
    <repository>
        <id>project</id>
        <url>file:///${basedir}/repo</url>
    </repository>
</repositories>

Xin chào, bạn đã đặt các tệp pom vào kho lưu trữ cục bộ hoặc bên cạnh các tệp jar của mình chưa?
Peymankh

Trong giải pháp trên, nó nằm cạnh các tệp JAR. Tâm trí bạn tôi không thích giải pháp trên vì nó quá nhiều công việc.
Archimedes Trajano

Tôi vẫn thích giải pháp tôi đã đăng ở đây stackoverflow.com/questions/2229757/ Khăn
Archimedes Trajano

Tôi thích cách tiếp cận này, mặc dù tôi đã sử dụng plugin cài đặt maven để tự động cài đặt jar vào repo cục bộ.
Carl G

13

Bạn thực sự phải có được một khung tại chỗ thông qua một kho lưu trữ và xác định các phụ thuộc của bạn lên phía trước. Sử dụng phạm vi hệ thống là một lỗi phổ biến mà mọi người sử dụng, bởi vì họ "không quan tâm đến việc quản lý phụ thuộc." Vấn đề là làm điều này bạn kết thúc với một bản dựng maven biến thái sẽ không hiển thị maven trong điều kiện bình thường. Bạn sẽ tốt hơn khi làm theo một cách tiếp cận như thế này .


12

Đây là cách chúng tôi thêm hoặc cài đặt một jar cục bộ

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

tôi đã đưa ra một số groupId và artifactId mặc định vì chúng là bắt buộc :)


11

Plugin cài đặt Maven có cách sử dụng dòng lệnh để cài đặt jar vào kho lưu trữ cục bộ, POM là tùy chọn nhưng bạn sẽ phải chỉ định GroupId, ArtifactId, Phiên bản và Bao bì (tất cả các công cụ POM).


thực ra, điều anh ấy nghĩ là bạn không cần phải tạo ra một pom cho thư viện mà bạn đang nhập vào kho lưu trữ cục bộ của bạn
Frederic Morin

5
-1, đôi khi bạn chỉ muốn thêm một tệp jar mà không gặp sự cố khi cài đặt nó.
Leonel

8

Sử dụng <scope>system</scope>là một ý tưởng tồi vì những lý do được người khác giải thích, cài đặt tệp theo cách thủ công vào kho lưu trữ cục bộ của bạn khiến việc xây dựng <url>file://${project.basedir}/repo</url>không thể thực hiện được và sử dụng cũng không phải là một ý tưởng hay vì (1) có thể không phải là một fileURL được định dạng tốt (ví dụ: nếu dự án được kiểm tra trong một thư mục có các ký tự bất thường), (2) kết quả không thể sử dụng được nếu POM của dự án này được sử dụng như một phần phụ thuộc của dự án của người khác.

Giả sử bạn không sẵn lòng tải cổ vật lên kho lưu trữ công cộng, đề xuất của Simeon về mô-đun trợ giúp thực hiện công việc. Nhưng có một cách dễ dàng hơn bây giờ

Khuyến nghị

Sử dụng plugin không phải maven-jar-maven . Liệu chính xác những gì bạn đã yêu cầu, không có nhược điểm của các phương pháp khác.


Cũng thấy maven-bên ngoài-phụ thuộc-plugin mặc dù không phải maven-jar-maven-plugin có vẻ đơn giản hơn để sử dụng.
Jesse Glick

8

Tôi tìm thấy một cách khác để làm điều này, xem ở đây từ một bài viết Heroku

Để tóm tắt (xin lỗi về một số bản sao và dán)

  • Tạo một repothư mục trong thư mục gốc của bạn:
dự án của bạn
+ - pom.xml
+ - src
+ - repo
  • Chạy này để cài đặt jar vào thư mục repo cục bộ của bạn
mvn triển khai: triển khai tập tin -Durl = tập tin: /// path / to / yourproject / repo / -Dfile = mylib-1.0.jar -DgroupId = com.example -DartifactId = mylib -Dpackaging = jar -Dversion = 1.0
  • Thêm cái này của bạn pom.xml:
<repositories>
    <!--other repositories if any-->
    <repository>
        <id>project.local</id>
        <name>project</name>
        <url>file:${project.basedir}/repo</url>
    </repository>
</repositories>


<dependency>
    <groupId>com.example</groupId>
    <artifactId>mylib</artifactId>
    <version>1.0</version>  
</dependency>

6

Sau khi thảo luận rất lâu với các anh chàng CloudBees về việc đóng gói đúng loại JAR như vậy, họ đã đưa ra một đề xuất tốt thú vị cho một giải pháp:

Tạo một dự án Maven giả gắn JAR có sẵn như là một tạo phẩm chính, chạy vào cài đặt POM thuộc về: thực thi tệp cài đặt. Dưới đây là một ví dụ về kinf như vậy của POM:

 <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <version>2.3.1</version>
            <executions>
                <execution>
                    <id>image-util-id</id>
                    <phase>install</phase>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                    <configuration>
                        <file>${basedir}/file-you-want-to-include.jar</file>
                        <groupId>${project.groupId}</groupId>
                        <artifactId>${project.artifactId}</artifactId>
                        <version>${project.version}</version>
                        <packaging>jar</packaging>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Nhưng để thực hiện nó, cấu trúc dự án hiện tại nên được thay đổi. Trước tiên, bạn nên nhớ rằng đối với mỗi loại JAR như vậy, cần tạo ra dự án Maven giả (mô-đun) khác nhau. Và cần phải tạo một dự án Maven mẹ bao gồm tất cả các mô-đun phụ: tất cả các trình bao bọc JAR và dự án chính hiện có. Cấu trúc có thể là:

dự án gốc (tệp này chứa tệp POM gốc bao gồm tất cả các mô đun con có thành phần XML mô đun ) (bao bì POM)

JAR 1 bao bọc Dự án con Maven (bao bì POM)

JAR 2 bao bọc Dự án con Maven (bao bì POM)

dự án con Maven chính hiện có (bao bì WAR, JAR, EAR ....)

Khi cha mẹ chạy qua mvn: install hoặc mvn: đóng gói bị ép buộc và các mô-đun phụ sẽ được thực thi. Điều đó có thể được coi là một điểm trừ ở đây, vì cấu trúc dự án nên được thay đổi, nhưng đưa ra một giải pháp không tĩnh ở cuối


Chỉ là một quan sát, nhưng tôi không nghĩ bạn cần tạo POM mới cho mỗi JAR bạn muốn thêm. Nó là đủ để tạo một POM duy nhất để thêm tất cả các JAR cung cấp cho bạn một khối thực thi cho mỗi tệp bạn muốn thêm. Bạn chỉ cần đảm bảo rằng mỗi khối có một id duy nhất. Kết quả là một mô-đun Maven duy nhất sẽ thêm tất cả các JAR vào repo cục bộ. (Chỉ cần đảm bảo rằng tọa độ maven không xung đột với bất cứ thứ gì có thể có ở đó hoặc có thể được thêm vào sau!)
Stormcloud

Anh hùng. Đây là chính xác những gì tôi muốn. Đẹp một người. 2013 phải là một năm tốt;)
ndtreviv

5

Điều có vẻ đơn giản nhất với tôi chỉ là cấu hình plugin maven-Trình biên dịch để bao gồm các lọ tùy chỉnh của bạn. Ví dụ này sẽ tải bất kỳ tệp jar nào trong thư mục lib.

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <includes>
                    <include>lib/*.jar</include>
                </includes>
            </configuration>
        </plugin>

1
Nếu tôi thêm maven này says nothing to complile!
Ravi Parekh

Nó nói all classes are up to date nothing to compilebởi vì nó sẽ không tìm kiếm *.javanữa. Bạn có thể thêm chúng trở lại bằng cách sử dụng <include>**/*.java</include>. Tuy nhiên, không có thành công cho tôi cho các lọ
Michael Laffargue

@Imiguelmh, bất kỳ lý do tại sao điều này không làm việc cho lọ?
kisna


3

Một giải pháp lạ tôi tìm thấy:

sử dụng Eclipse

  • tạo dự án java đơn giản (không phải maven)
  • thêm một lớp chính
  • thêm tất cả các lọ vào đường dẫn
  • xuất JAR Runnable (điều này rất quan trọng, vì không có cách nào khác để làm điều đó)
  • chọn Trích xuất các thư viện cần thiết vào JAR được tạo
  • quyết định vấn đề giấy phép
  • tadammm ... cài đặt jar đã tạo vào m2repo của bạn
  • thêm phụ thuộc duy nhất này vào các dự án khác của bạn.

chúc mừng, Balint


3

Nếu bạn muốn một giải pháp nhanh chóng và bẩn thỉu, bạn có thể làm như sau (mặc dù tôi không khuyến nghị điều này cho bất cứ điều gì ngoại trừ các dự án thử nghiệm, maven sẽ phàn nàn về điều này là không phù hợp).

Thêm một mục phụ thuộc cho mỗi tệp jar bạn cần, tốt nhất là với tập lệnh perl hoặc một cái gì đó tương tự và sao chép / dán nó vào tệp pom của bạn.

#! /usr/bin/perl

foreach my $n (@ARGV) {

    $n=~s@.*/@@;

    print "<dependency>
    <groupId>local.dummy</groupId>
    <artifactId>$n</artifactId>
    <version>0.0.1</version>
    <scope>system</scope>
    <systemPath>\${project.basedir}/lib/$n</systemPath>
</dependency>
";

Vâng, đây chính xác là những gì tôi đang 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 đó là tất cả những gì họ nói :) Các giải pháp plugin maven khác nhau dường như quá mức cho mục đích của tôi. Tôi có một số lọ được trao cho tôi dưới dạng lib của bên thứ 3 với tệp pom. Tôi muốn nó biên dịch / chạy nhanh. Giải pháp này mà tôi thích nghi một cách tầm thường với con trăn đã làm việc kỳ diệu đối với tôi. Cắt và dán vào pom của tôi.
Paul

3

Một cách nhanh chóng & bẩn giải pháp hàng loạt (dựa trên câu trả lời của Alex):

libs.bat

@ECHO OFF
FOR %%I IN (*.jar) DO (
echo ^<dependency^>
echo ^<groupId^>local.dummy^</groupId^>
echo ^<artifactId^>%%I^</artifactId^>
echo ^<version^>0.0.1^</version^>
echo ^<scope^>system^</scope^>
echo ^<systemPath^>${project.basedir}/lib/%%I^</systemPath^>
echo ^</dependency^>
)

Thực hiện nó như thế này : libs.bat > libs.txt. Sau đó mở libs.txtvà sao chép nội dung của nó như là phụ thuộc.

Trong trường hợp của tôi, tôi chỉ cần các thư viện biên dịch mã của mình và giải pháp này là tốt nhất cho mục đích đó.


2

Mặc dù nó không thực sự phù hợp với vấn đề của bạn, tôi sẽ bỏ nó ở đây. Yêu cầu của tôi là:

  1. Các lọ không thể tìm thấy trong kho lưu trữ maven trực tuyến nên có trong SVN.
  2. Nếu một nhà phát triển thêm thư viện khác, các nhà phát triển khác không nên bận tâm với việc cài đặt chúng theo cách thủ công.
  3. IDE (NetBeans trong trường hợp của tôi) sẽ có thể tìm thấy các nguồn và javadocs để cung cấp tự động hoàn thành và trợ giúp.

Trước tiên hãy nói về (3): Chỉ cần có các lọ trong một thư mục và bằng cách nào đó, việc hợp nhất chúng vào bình cuối cùng sẽ không hoạt động ở đây, vì IDE sẽ không hiểu điều này. Điều này có nghĩa là tất cả các thư viện phải được cài đặt đúng. Tuy nhiên, tôi không muốn mọi người cài đặt nó bằng "mvn install-file".

Trong dự án của tôi, tôi cần metawidget. Ở đây chúng tôi đi:

  1. Tạo một dự án maven mới (đặt tên là "shared-libs" hoặc đại loại như thế).
  2. Tải xuống metawidget và giải nén zip vào src / main / lib.
  3. Thư mục doc / api chứa javadocs. Tạo một zip của nội dung (doc / api / api.zip).
  4. Sửa đổi pom như thế này
  5. Xây dựng dự án và thư viện sẽ được cài đặt.
  6. Thêm thư viện làm phụ thuộc vào dự án của bạn hoặc (nếu bạn đã thêm phụ thuộc vào dự án chia sẻ libs) thêm chia sẻ lib làm phụ thuộc để có được tất cả các thư viện cùng một lúc.

Mỗi khi bạn có một thư viện mới, chỉ cần thêm một thực thi mới và nói với mọi người xây dựng lại dự án (bạn có thể cải thiện quy trình này với các chữ tượng hình dự án).


Bạn có thể muốn kiểm tra Maven: thêm một phụ thuộc vào một jar theo đường dẫn tương đối (IMHO là một lựa chọn tốt hơn).
Pascal Thivent

Sẽ tốt hơn nếu bạn có thể đảm bảo rằng kho lưu trữ cục bộ luôn có cùng đường dẫn tương đối đến dự án. Nếu tôi có nhiều dự án (hoặc các chi nhánh khác nhau) ở các địa điểm khác nhau thì điều này sẽ không hoạt động.
Cephalepad

Câu trả lời của tôi có một cách để nói với pom.xml về một jar trong dự án của bạn. Tại sao không làm điều đó và chỉ nó vào các lọ trong $ {Dựair} / lib?
Ed Brannin

1
@Ed Bởi vì đó hoàn toàn không phải là phạm vi hệ thống dành cho, phụ thuộc phạm vi hệ thống có rất nhiều tác dụng phụ. Đây là một thực tế khủng khiếp nên bị cấm hoàn toàn.
Pascal Thivent

2

Để cài đặt jar bên thứ 3 không có trong kho lưu trữ maven, hãy sử dụng maven-install-plugin.

Dưới đây là các bước:

  1. Tải xuống tệp jar theo cách thủ công từ nguồn (trang web)
  2. Tạo một thư mục và đặt tệp jar của bạn vào đó
  3. Chạy lệnh bên dưới để cài đặt jar bên thứ 3 trong kho lưu trữ maven cục bộ của bạn

cài đặt mvn: install-file -Dfile = -DgroupId = -DartifactId = -Dversion = -Dpackaging =

Dưới đây là ví dụ tôi đã sử dụng nó cho simonsite log4j

mvn install: install-file -Dfile = / Users / athanka / git / MyProject / repo / log4j-roll-appender.jar -DgroupId = uk.org.simonsite -DartifactId = log4j-roll-appender -Dversion = 20150607 Dpackaging = jar

  1. Trong tệp pom.xml bao gồm phần phụ thuộc như bên dưới

      <dependency> 
            <groupId>uk.org.simonsite</groupId>
            <artifactId>log4j-rolling-appender</artifactId>
            <version>20150607-2059</version> 
      </dependency>
  2. Chạy lệnh mvn clean install để tạo bao bì của bạn

Dưới đây là liên kết tham khảo:

https://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html


Đây là một câu trả lời chỉ liên kết đường biên giới . Bạn nên mở rộng câu trả lời của mình để bao gồm nhiều thông tin ở đây và chỉ sử dụng liên kết để tham khảo.
Tạm biệt StackExchange

2

Đối với những người không tìm thấy câu trả lời tốt ở đây, đây là những gì chúng tôi đang làm để có được một bình với tất cả các phụ thuộc cần thiết trong đó. Câu trả lời này ( https://stackoverflow.com/a/7623805/1084306 ) đề cập đến việc sử dụng plugin Maven hội nhưng thực tế không đưa ra một ví dụ trong câu trả lời. Và nếu bạn không đọc hết câu trả lời cho đến hết câu trả lời (nó khá dài), bạn có thể bỏ lỡ nó. Thêm phần bên dưới vào tệp pom.xml của bạn sẽ tạo ratarget/${PROJECT_NAME}-${VERSION}-jar-with-dependencies.jar

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.4.1</version>
            <configuration>
                <!-- get all project dependencies -->
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <!-- MainClass in mainfest make a executable jar -->
                <archive>
                  <manifest>
                    <mainClass>my.package.mainclass</mainClass>
                  </manifest>
                </archive>

            </configuration>
            <executions>
              <execution>
                <id>make-assembly</id>
                <!-- bind to the packaging phase -->
                <phase>package</phase> 
                <goals>
                    <goal>single</goal>
                </goals>
              </execution>
            </executions>
        </plugin>

1

Tôi đã ám chỉ một số mã trăn trong một bình luận cho câu trả lời từ @alex lehmann, vì vậy tôi đang đăng nó ở đây.

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

0

Điều này không trả lời làm thế nào để thêm chúng vào POM của bạn và có thể không có trí tuệ, nhưng sẽ chỉ thêm thư mục lib vào đường dẫn lớp của bạn? Tôi biết đó là những gì tôi làm khi tôi cần một bình bên ngoài mà tôi không muốn thêm vào kho lưu trữ Maven của mình.

Hi vọng điêu nay co ich.


1
Đây là những gì tôi đã làm, và nó hoạt động, nhưng nó cũng gây ô nhiễm con đường giai cấp toàn cầu, và tôi đang cố gắng thoát khỏi nó. Cảm ơn!

@purple Chính xác thì bạn đã làm điều đó như thế nào?
TheRealChx101

0

Những gì hoạt động trong dự án của chúng tôi là những gì Archimedes Trajano đã viết, nhưng chúng tôi đã có trong .m2 / settings.xml của chúng tôi một cái gì đó như thế này:

 <mirror>
  <id>nexus</id>
  <mirrorOf>*</mirrorOf>
  <url>http://url_to_our_repository</url>
 </mirror>

và * nên được thay đổi thành trung tâm. Vì vậy, nếu câu trả lời của anh ấy không phù hợp với bạn, bạn nên kiểm tra cài đặt của bạn


0

Tôi chỉ muốn một cách giải quyết nhanh chóng và bẩn thỉu ... Tôi không thể chạy tập lệnh từ Nikita Volkov: lỗi cú pháp + nó yêu cầu một định dạng nghiêm ngặt cho các tên jar.

Tôi đã tạo tập lệnh Perl này hoạt động với bất kỳ định dạng nào cho tên tệp jar và nó tạo ra các phụ thuộc trong xml để có thể sao chép được dán trực tiếp vào pom.

Nếu bạn muốn sử dụng nó, hãy chắc chắn rằng bạn hiểu kịch bản đang làm gì, bạn có thể cần thay đổi libthư mục và giá trị cho groupIdhoặc artifactId...

#!/usr/bin/perl

use strict;
use warnings;

open(my $fh, '>', 'dependencies.xml') or die "Could not open file 'dependencies.xml' $!";
foreach my $file (glob("lib/*.jar")) {
    print "$file\n";
    my $groupId = "my.mess";
    my $artifactId = "";
    my $version = "0.1-SNAPSHOT";
    if ($file =~ /\/([^\/]*?)(-([0-9v\._]*))?\.jar$/) {
        $artifactId = $1;
        if (defined($3)) {
            $version = $3;
        }
        `mvn install:install-file -Dfile=$file -DgroupId=$groupId -DartifactId=$artifactId -Dversion=$version -Dpackaging=jar`;
        print $fh "<dependency>\n\t<groupId>$groupId</groupId>\n\t<artifactId>$artifactId</artifactId>\n\t<version>$version</version>\n</dependency>\n";
        print " => $groupId:$artifactId:$version\n";
    } else {
        print "##### BEUH...\n";
    }
}
close $fh;

0

Giải pháp cho phương pháp scope = 'system' trong Java:

public static void main(String[] args) {
        String filepath = "/Users/Downloads/lib/";
        try (Stream<Path> walk = Files.walk(Paths.get(filepath))) {

        List<String> result = walk.filter(Files::isRegularFile)
                .map(x -> x.toString()).collect(Collectors.toList());

                String indentation = "    ";
                for (String s : result) {
                    System.out.println(indentation + indentation + "<dependency>");
                    System.out.println(indentation + indentation + indentation + "<groupId>"
                            + s.replace(filepath, "").replace(".jar", "")
                            + "</groupId>");
                    System.out.println(indentation + indentation + indentation + "<artifactId>"
                            + s.replace(filepath, "").replace(".jar", "")
                            + "</artifactId>");
                    System.out.println(indentation + indentation + indentation + "<version>"
                            + s.replace(filepath, "").replace(".jar", "")
                            + "</version>");
                    System.out.println(indentation + indentation + indentation + "<scope>system</scope>");
                    System.out.println(indentation + indentation + indentation + "<systemPath>" + s + "</systemPath>");
                    System.out.println(indentation + indentation + "</dependency>");
                }

    } catch (IOException e) {
        e.printStackTrace();
    }
}
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.