Maven và thêm JAR vào phạm vi hệ thống


86

Tôi có một JAR trong dự án Android của mình và tôi muốn nó được thêm vào APK cuối cùng. Được rồi, tôi bắt đầu:

    <dependency>
        <groupId>com.loopj.android.http</groupId>
        <artifactId>android-async-http</artifactId>
        <version>1.3.2</version>
        <type>jar</type>
        <scope>system</scope>
        <systemPath>${project.basedir}/libs/android-async-http-1.3.2.jar</systemPath>
    </dependency>

Nhưng khi tôi đang chạy, mvn packagetôi nhận được cảnh báo:

[WARNING] Some problems were encountered while building the effective model for **apk:1.0
[WARNING] 'dependencies.dependency.systemPath' for com.loopj.android.http:android-async-http:jar should not point at files within the project directory, ${project.basedir}/libs/android-async-http-1.3.2.jar will be unresolvable by dependent projects @ line 36, column 25

Và trong APK cuối cùng không có JAR.

Làm cách nào để khắc phục điều đó?


3
Bạn không thể sử dụng phạm vi hệ thống theo cách này. sử dụng install: install-file.
bmargulies

@bmargulies Bạn có thể nói phạm vi này để làm gì không?
efpies

1
Tôi đã chuyển sang gradle và không còn những cơn đau đầu này nữa ngoại trừ bây giờ tôi đang cố gắng sử dụng một thư viện mã nguồn mở với maven và tạm thời hack một cái lọ (điều này quá dễ trong gradle và rất khó trong maven).
Dean Hiller

1
Câu hỏi này có cuộc thảo luận về làm thế nào để tránh sử dụng phạm vi hệ thống trong Maven: stackoverflow.com/questions/3642023/...
Đánh dấu Butler

Tài liệu chính thức về phạm vi 'hệ thống': maven.apache.org/guides/introduction/…
Guillaume Husta

Câu trả lời:


24

Bạn sẽ cần thêm jar vào kho lưu trữ maven cục bộ của mình. Ngoài ra (tùy chọn tốt hơn) chỉ định kho lưu trữ thích hợp (nếu có) để nó có thể được maven tự động tải xuống

Trong cả hai trường hợp, hãy xóa <systemPath>thẻ khỏi phần phụ thuộc


4
Tôi đã xem bài báo đó nhưng tôi hy vọng không thực hiện maven installtrên mọi máy tính mà tôi muốn xây dựng dự án đó (tiếc là tôi không tìm thấy JAR này trong repos). Cảm ơn! :)
efpies

1
Nó có thể được viết kịch bản như một phần của bản dựng.
Thorbjørn Ravn Andersen

143

Tôi không biết lý do thực sự nhưng Maven thúc đẩy các nhà phát triển cài đặt tất cả các thư viện (tùy chỉnh) vào một số kho lưu trữ của maven, vì vậy scope:systemkhông được yêu thích lắm, Một giải pháp đơn giản là sử dụngmaven-install-plugin

theo cách sử dụng:

viết sự phụ thuộc của bạn theo cách này

<dependency>
    <groupId>com.mylib</groupId>
    <artifactId>mylib-core</artifactId>
    <version>0.0.1</version>
</dependency>

sau đó, thêm maven-install-plugin

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-install-plugin</artifactId>
    <version>2.5.2</version>
    <executions>
        <execution>
            <id>install-external</id>
            <phase>clean</phase>
            <configuration>
                <file>${basedir}/lib/mylib-core-0.0.1.jar</file>
                <repositoryLayout>default</repositoryLayout>
                <groupId>com.mylib</groupId>
                <artifactId>mylib-core</artifactId>
                <version>0.0.1</version>
                <packaging>jar</packaging>
                <generatePom>true</generatePom>
            </configuration>
            <goals>
                <goal>install-file</goal>
            </goals>
        </execution>
    </executions>
</plugin>

chú ý đến phase:clean, để cài đặt thư viện tùy chỉnh của bạn vào kho lưu trữ của bạn, bạn phải chạy mvn cleanvà sau đómvn install


10
Tại sao không sử dụng <phase>process-resources</phase>thay vì <phase>clean</phase>. Giai đoạn tài nguyên quy trình trông thích hợp hơn cho một kịch bản như vậy và nó luôn được gọi trước giai đoạn biên dịch.
jplandrain

1
trong lần cài đặt đầu tiên, bạn có chắc mình có thể vượt qua giai đoạn 'xác thực' xảy ra trước tài nguyên quy trình trong 'vòng đời được xây dựng' không? ; ), 'vòng đời sạch' trước tiên là 'vòng đời được xây dựng' và nó không phụ thuộc vào bất kỳ xác thực nào, tutorialspoint.com/maven/maven_build_life_cycle.htm
Ging3r 24/08/2016

5
Nó hoạt động, nhưng làm thế nào để bạn cài đặt một số phụ thuộc?
Renaud Pawlak

6
Stackoverflow nên thêm một tính năng cho phép cộng đồng ghi đè lựa chọn câu trả lời đúng của OP, bởi vì IMHO, Câu trả lời này phải được chấp nhận! :)
Vijay Chavda

2
Như những người khác đã nhận xét, ràng buộc với cleanpha rất dễ gây hiểu lầm, nó không phải là một phần của vòng đời mặc định và làm sai lệch ý nghĩa của clean. Hơn nữa, thay đổi được đề xuất để sử dụng một giai đoạn trong vòng đời mặc định (ví dụ validatehoặc process-resources) sẽ không thành công trong tình huống nhiều mô-đun, vì trình tổng hợp cố gắng giải quyết phần phụ thuộc, trước khi thực thi bất kỳ mục tiêu tùy chỉnh nào cho mô-đun con.
len.in.silver

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

Thử đi.


11

Phạm vi hệ thống chỉ được thiết kế để xử lý các tệp 'hệ thống'; tập tin ở một số vị trí cố định. Tệp trong /usr/lib, hoặc ${java.home}(ví dụ tools.jar). Nó không được thiết kế để hỗ trợ các .jartệp khác trong dự án của bạn.

Các tác giả cố tình từ chối làm cho việc mở rộng tên đường dẫn phù hợp để làm bạn nản lòng. Do đó, trước mắt bạn có thể sử dụng install:install-fileđể cài đặt vào kho lưu trữ cục bộ và sau đó một ngày nào đó sử dụng trình quản lý kho lưu trữ để chia sẻ.


3

Sử dụng trình quản lý kho lưu trữ và cài đặt loại lọ này vào đó. Điều đó giải quyết vấn đề của bạn và cho tất cả các máy tính trong mạng của bạn.


3
Chúng tôi dự định chạy repo trên máy chủ cục bộ vào ngày mai hoặc sau ngày mai nhưng trước đó tôi nên giải quyết vấn đề này theo cách khác.
efpies

1
Như @efpies đã đề cập, đây có thể là một câu trả lời trên trời khi nhà phát triển không có quyền / khả năng tạo trình quản lý repo.
javadba

Ngày nay, nếu bạn đã cài đặt docker, tất cả những gì bạn cần docker run -d -p 8081:8081 --name nexus sonatype/nexus3- hãy xem hub.docker.com/r/sonatype/nexus3 để biết chi tiết.
Thorbjørn Ravn Andersen

3

Hãy thử cấu hình này. Nó đã làm việc cho tôi:

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <warSourceDirectory>mywebRoot</warSourceDirectory>
        <warSourceExcludes>source\**,build\**,dist\**,WEB-INF\lib\*,
            WEB-INF\classes\**,build.*
        </warSourceExcludes>
        <webXml>myproject/source/deploiement/web.xml</webXml>
        <webResources>
            <resource>
                <directory>mywebRoot/WEB-INF/lib</directory>
                <targetPath>WEB-INF/lib</targetPath>
                <includes>
                        <include>mySystemJar1.jar.jar</include>
                         <include>mySystemJar2.jar</include>
                   </includes>
            </resource>
        </webResources>
    </configuration>
</plugin>

0

mvn install: install-file -DgroupId = com.paic.maven -DartifactId = tplconfig-maven-plugin -Dversion = 1.0 -Dpackaging = jar -Dfile = tplconfig-maven-plugin-1.0.jar -DgeneratePom = true

Cài đặt jar vào kho lưu trữ cục bộ.


3
Điều này phức tạp hơn việc thêm trực tiếp qua pom.
Pradeeban Kathiravelu

0

Nhờ Ging3r, tôi đã có giải pháp:

làm theo các bước sau:

  1. không sử dụng trong thẻ phụ thuộc. Sử dụng sau trong thẻ phụ thuộc trong tệp pom.xml ::

    <dependency>
    <groupId>com.netsuite.suitetalk.proxy.v2019_1</groupId>
    <artifactId>suitetalk-axis-proxy-v2019_1</artifactId>
    <version>1.0.0</version>
    </dependency>
    <dependency>
        <groupId>com.netsuite.suitetalk.client.v2019_1</groupId>
        <artifactId>suitetalk-client-v2019_1</artifactId>
        <version>2.0.0</version>
    </dependency>
    <dependency>
        <groupId>com.netsuite.suitetalk.client.common</groupId>
        <artifactId>suitetalk-client-common</artifactId>
        <version>1.0.0</version>
    </dependency>
    
  2. sử dụng mã sau trong thẻ plugin trong tệp pom.xml:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <version>2.5.2</version>
            <executions>
                <execution>
                    <id>suitetalk-proxy</id>
                    <phase>clean</phase>
                    <configuration>
                        <file>${basedir}/lib/suitetalk-axis-proxy-v2019_1-1.0.0.jar</file>
                        <repositoryLayout>default</repositoryLayout>
                        <groupId>com.netsuite.suitetalk.proxy.v2019_1</groupId>
                        <artifactId>suitetalk-axis-proxy-v2019_1</artifactId>
                        <version>1.0.0</version>
                        <packaging>jar</packaging>
                        <generatePom>true</generatePom>
                    </configuration>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                </execution>
                <execution>
                    <id>suitetalk-client</id>
                    <phase>clean</phase>
                    <configuration>
                        <file>${basedir}/lib/suitetalk-client-v2019_1-2.0.0.jar</file>
                        <repositoryLayout>default</repositoryLayout>
                        <groupId>com.netsuite.suitetalk.client.v2019_1</groupId>
                        <artifactId>suitetalk-client-v2019_1</artifactId>
                        <version>2.0.0</version>
                        <packaging>jar</packaging>
                        <generatePom>true</generatePom>
                    </configuration>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                </execution>
                <execution>
                    <id>suitetalk-client-common</id>
                    <phase>clean</phase>
                    <configuration>
                        <file>${basedir}/lib/suitetalk-client-common-1.0.0.jar</file>
                        <repositoryLayout>default</repositoryLayout>
                        <groupId>com.netsuite.suitetalk.client.common</groupId>
                        <artifactId>suitetalk-client-common</artifactId>
                        <version>1.0.0</version>
                        <packaging>jar</packaging>
                        <generatePom>true</generatePom>
                    </configuration>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    

Tôi đang bao gồm 3 lọ từ thư mục lib:

bao gồm jar bên ngoài trong dự án khởi động mùa xuân

Cuối cùng, sử dụng mvn cleanvà sau đó mvn installhoặc 'mvn clean install' và chỉ chạy tệp jar từ thư mục đích hoặc đường dẫn nơi cài đặt (xem mvn installnhật ký):

java -jar abc.jar

lưu ý: Hãy nhớ một điều nếu bạn đang làm việc tại jenkins thì trước tiên hãy sử dụng mvn cleanvà sau đó mvn clean installlệnh làm việc cho bạn bởi vì với mã trước đó mvn clean installbộ nhớ cache lưu trữ lệnh để phụ thuộc.

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.