Maven และเพิ่ม JARs ในขอบเขตระบบ


86

ฉันมี JAR ในโปรเจ็กต์ Android ของฉันและฉันต้องการให้เพิ่มลงใน APK สุดท้าย โอเคไปเลย:

    <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>

แต่เมื่อฉันวิ่งmvn packageฉันได้รับคำเตือน:

[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

และใน APK สุดท้ายจะไม่มี JAR

ฉันจะแก้ไขได้อย่างไร


3
คุณไม่สามารถใช้ขอบเขตระบบด้วยวิธีนี้ ใช้การติดตั้ง: ติดตั้งไฟล์
bmargulies

@bmargulies บอกได้ไหมว่าขอบเขตนี้มีไว้เพื่ออะไร?
efpies

1
ฉันเปลี่ยนไปใช้ gradle และไม่ต้องปวดหัวอีกต่อไปยกเว้นตอนนี้ฉันกำลังพยายามใช้ไลบรารีโอเพนซอร์สกับ maven และแฮ็คโถในชั่วคราว (ซึ่งง่ายมากในการไล่ระดับสีและยากมากใน maven)
Dean Hiller

1
คำถามนี้มีการอภิปรายเกี่ยวกับวิธีหลีกเลี่ยงการใช้ขอบเขตระบบใน Maven: stackoverflow.com/questions/3642023/…
Mark Butler

เอกสารอย่างเป็นทางการเกี่ยวกับขอบเขต 'ระบบ': maven.apache.org/guides/introduction/…
Guillaume

คำตอบ:


24

คุณจะต้องเพิ่ม jarในที่เก็บ maven ในพื้นที่ของคุณ อีกทางเลือกหนึ่ง (ตัวเลือกที่ดีกว่า) ระบุที่เก็บที่เหมาะสม (ถ้ามี) เพื่อให้ maven ดาวน์โหลดโดยอัตโนมัติ

ไม่ว่าในกรณีใดให้ลบ<systemPath>แท็กออกจากการอ้างอิง


4
ฉันเคยเห็นบทความนั้น แต่ฉันหวังว่าจะไม่ทำmaven installบนคอมพิวเตอร์ทุกเครื่องที่ฉันต้องการสร้างโปรเจ็กต์นั้น (น่าเสียดายที่ฉันไม่พบ JAR นี้ใน repos) ขอบคุณ! :)
efpies

1
สามารถเขียนสคริปต์เป็นส่วนหนึ่งของการสร้าง
Thorbjørn Ravn Andersen

145

ฉันไม่รู้เหตุผลที่แท้จริง แต่ Maven ผลักดันให้นักพัฒนาติดตั้งไลบรารีทั้งหมด (กำหนดเองด้วย) ลงในที่เก็บ maven บางแห่งจึงscope:systemไม่ค่อยชอบวิธีแก้ปัญหาง่ายๆคือการใช้maven-install-plugin

ติดตามการใช้งาน:

เขียนการพึ่งพาของคุณด้วยวิธีนี้

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

จากนั้นเพิ่ม 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>

ให้ความสนใจในphase:cleanการติดตั้งไลบรารีที่กำหนดเองของคุณลงในที่เก็บของคุณคุณต้องเรียกใช้mvn cleanแล้วmvn install


10
ทำไมไม่ใช้<phase>process-resources</phase>แทน<phase>clean</phase>. เฟสทรัพยากรกระบวนการดูเหมาะสมกว่าสำหรับสถานการณ์ดังกล่าวและจะถูกเรียกก่อนเฟสคอมไพล์เสมอ
jplandrain

1
ในการติดตั้งครั้งแรกคุณแน่ใจหรือไม่ว่าคุณสามารถผ่านขั้นตอน 'ตรวจสอบความถูกต้อง' ซึ่งมาก่อนทรัพยากรกระบวนการใน 'วงจรชีวิตที่สร้างขึ้น' ได้ ; ) 'วงจรชีวิตที่สะอาด' มาก่อน 'วงจรชีวิตที่สร้างขึ้น' และไม่ได้ขึ้นอยู่กับการตรวจสอบความถูกต้องใด ๆtutorialspoint.com/maven/maven_build_life_cycle.htm
Ging3r

5
มันใช้งานได้ แต่คุณจะติดตั้งการอ้างอิงหลาย ๆ อย่างได้อย่างไร?
มองซิเออร์

6
Stackoverflow ควรเพิ่มคุณลักษณะที่ช่วยให้ชุมชนสามารถแทนที่ตัวเลือกคำตอบที่ถูกต้องของ OP ได้เพราะ IMHO คำตอบนี้ควรเป็นคำตอบที่ยอมรับ! :)
Vijay Chavda

2
เป็นคนอื่นได้แสดงความเห็นว่าผูกพันกับขั้นตอนเป็นอย่างมากที่ทำให้เข้าใจผิดก็ไม่ได้เป็นส่วนหนึ่งของวงจรชีวิตเริ่มต้นและบิดเบือนความหมายของclean cleanนอกจากนี้การเปลี่ยนแปลงที่แนะนำให้ใช้เฟสในวงจรชีวิตเริ่มต้น (เช่นvalidateหรือprocess-resources) จะล้มเหลวในสถานการณ์แบบหลายโมดูลเนื่องจากผู้รวบรวมจะพยายามแก้ปัญหาการอ้างอิงก่อนที่เป้าหมายที่กำหนดเองจะดำเนินการสำหรับโมดูลลูก
wool.in.silver

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

ลองทำตามนี้


11

ขอบเขตของระบบได้รับการออกแบบมาเพื่อจัดการกับไฟล์ "ระบบ" เท่านั้น ไฟล์ที่อยู่ในตำแหน่งคงที่ ไฟล์ใน/usr/libหรือ${java.home}(เช่นtools.jar) ไม่ได้ออกแบบมาเพื่อรองรับ.jarไฟล์เบ็ดเตล็ดในโครงการของคุณ

ผู้เขียนจงใจปฏิเสธที่จะทำให้การขยายชื่อพา ธ ทำงานอย่างถูกต้องเพื่อเป็นการกีดกันคุณ ด้วยเหตุนี้ในระยะสั้นคุณสามารถใช้install:install-fileเพื่อติดตั้งลงใน repo ในเครื่องจากนั้นบางวันก็ใช้ repo manager เพื่อแชร์


3

ใช้ตัวจัดการที่เก็บและติดตั้งไหประเภทนี้ลงไป ซึ่งช่วยแก้ปัญหาของคุณได้ทั้งหมดและสำหรับคอมพิวเตอร์ทุกเครื่องในเครือข่ายของคุณ


3
เราวางแผนที่จะเรียกใช้ repo บนเซิร์ฟเวอร์ภายในวันพรุ่งนี้หรือหลังจากวันพรุ่งนี้ แต่ก่อนหน้านั้นฉันควรแก้ปัญหานี้ด้วยวิธีอื่น
efpies

1
ดังที่ @efpies กล่าวถึงสิ่งนี้อาจเป็นคำตอบแบบวงกลมบนท้องฟ้าเมื่อนักพัฒนาไม่มีสิทธิ์ / ความสามารถในการสร้าง repo manager
StephenBoesch

วันนี้หากคุณติดตั้งนักเทียบท่าทั้งหมดที่คุณต้องการก็คือdocker run -d -p 8081:8081 --name nexus sonatype/nexus3ดูรายละเอียดได้ที่hub.docker.com/r/sonatype/nexus3
Thorbjørn Ravn Andersen

3

ลองใช้การกำหนดค่านี้ มันได้ผลสำหรับฉัน:

<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

ติดตั้ง jar ลงในที่เก็บในเครื่อง


3
ยุ่งยากกว่าการเติมผ่านปอมโดยตรง
Pradeeban Kathiravelu

0

ขอบคุณ Ging3r ฉันมีวิธีแก้ปัญหา:

ทำตามขั้นตอนเหล่านี้:

  1. อย่าใช้ในแท็กอ้างอิง ใช้สิ่งต่อไปนี้ในแท็กการอ้างอิงในไฟล์ 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. ใช้โค้ดต่อไปนี้ในแท็กปลั๊กอินในไฟล์ 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>
    

ฉันรวม 3 ขวดจากโฟลเดอร์ lib:

รวมถึงโถภายนอกในโครงการสปริงบูต

สุดท้ายใช้mvn cleanแล้วmvn installหรือ 'mvn clean install' และเพียงแค่เรียกใช้ไฟล์ jar จากโฟลเดอร์เป้าหมายหรือเส้นทางที่ติดตั้ง (ดูmvn installบันทึก):

java -jar abc.jar

หมายเหตุ: โปรดจำไว้ว่าสิ่งหนึ่งที่ถ้าคุณกำลังทำงานอยู่ที่เจนกินส์ใช้แล้วเป็นครั้งแรกmvn cleanและจากนั้นmvn clean installสั่งการทำงานสำหรับคุณเพราะด้วยรหัสก่อนหน้าmvn clean installแคชเก็บคำสั่งสำหรับการพึ่งพา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.