Maven: วิธีที่ดีที่สุดในการเชื่อมโยง JAR ภายนอกที่กำหนดเองกับโครงการของฉัน


151

เป็นสองสามวันแรกที่ฉันเรียนรู้ Maven และฉันยังคงดิ้นรนกับพื้นฐาน ฉันมีไฟล์. jar ภายนอก (ไม่สามารถใช้ได้ใน repos สาธารณะ) ที่ฉันต้องอ้างอิงในโครงการของฉันและฉันพยายามที่จะคิดออกว่าตัวเลือกที่ดีที่สุดของฉันคืออะไร

มันเป็นโครงการขนาดเล็กที่ไม่มีที่เก็บส่วนกลางสำหรับห้องสมุดดังนั้นจึงต้องเป็นที่เก็บข้อมูลในเครื่อง (เพิ่มอย่างใดลงในตัวควบคุมแหล่งข้อมูลไม่ทราบว่าควรจะทำงานในลักษณะนี้หรือไม่) หรือจำเป็นต้องจัดเก็บ. jar ดิสก์ภายนอกที่เก็บข้อมูลอย่างเป็นทางการ

1) ตัวเลือกที่ดีที่สุดของฉันคืออะไรสำหรับการเพิ่มไฟล์. jar ไปยังการอ้างอิงโครงการของฉันด้วย maven เนื่องจากฉันต้องการให้ทั้งโครงการและไลบรารีอยู่ในการควบคุมแหล่งที่มา?

2) ฉันยังดูเหมือนจะไม่ได้ที่ Eclipse จะเห็นการพึ่งพา ฉันเพิ่มมันเข้าไปในส่วนของ pom ด้วยตนเองและมันก็แสดงให้เห็นได้ดีในรายการการพึ่งพาใน m2eclipse mvn คอมไพล์และแพ็คเกจ mvn สำเร็จทั้งคู่ แต่การรันผลลัพธ์ของโปรแกรมใน:

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

นี่คือหลังจากแก้ไข POM เป็น:

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

ฉันควรจะดำเนินการติดตั้ง mvn: install-file แม้คิดว่าฉันมี pom.xml แก้ไขดังกล่าวข้างต้น?

ขอบคุณ!

คำตอบ:


67

ฉันคิดว่าคุณควรใช้mvn install:install-fileเพื่อเติมที่เก็บในเครื่องของคุณด้วยไหในไลบรารีจากนั้นคุณควรเปลี่ยนขอบเขตจากระบบเป็นคอมไพล์

หากคุณเริ่มต้นด้วย Maven ฉันขอแนะนำให้ใช้ Maven โดยตรงไม่ใช่ปลั๊กอิน IDE เพราะมันจะเพิ่มความซับซ้อนเป็นพิเศษ

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

ฉันไม่เข้าใจว่าทำไมคุณต้องการที่จะนำไลบรารี่ไปใช้ในการควบคุมซอร์สโค้ดมันมีไว้สำหรับซอร์สโค้ดไม่ใช่ jars ไบนารี


36
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับmvn install::install-file: mkyong.com/maven/…
Doug T.

7
การใช้mvn install::install-fileที่เก็บข้อมูลในเครื่องของคุณหมายความว่าทุกคนที่โคลนรหัสต้นฉบับของคุณจะต้องทำตามขั้นตอนนี้ด้วยตนเอง มิฉะนั้นโครงสร้างจะแตกออกจากกล่อง
Isen Ng

ที่จะไม่เพิ่ม jar ลงในไฟล์ war แม้ว่า
Prachi

207

คุณสามารถสร้าง In Project Repository ได้ดังนั้นคุณไม่จำเป็นต้องrun mvn install:install-fileทำงานทุกครั้งที่ใช้คอมพิวเตอร์เครื่องใหม่

<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

รายละเอียดอ่านโพสต์บล็อกนี้

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


2
การใช้วิธีแก้ไขปัญหาข้างต้นแสดงคำเตือนขณะทำ "mvn clean package" - POM สำหรับโครงการ <dependency_name> หายไปไม่มีข้อมูลการพึ่งพา
Jignesh Gohel

นั่นเป็นทางออกที่ดีที่สุดสำหรับกรณีที่คุณต้องการเพิ่มไฟล์ jar หนึ่งไฟล์หรือไม่กี่ไฟล์ ขอบคุณ
Antonio Sesto

2
หรือคุณสามารถเพิ่มการพึ่งพาในท้องถิ่นโดยตรงเช่นเดียวกับในstackoverflow.com/a/22300875/640378
mauryat

2
ฉันต้องใช้ไฟล์: /// $ {project.basedir} / libs (3 สแลชที่ฟอร์เวิร์ด) แทนไฟล์: // $ {project.basedir} / libs
Loc Phan

2
หาก jar ที่กำลังติดตั้งไม่ใช่ jar ที่รวบรวม maven คุณจะต้องเพิ่มไฟล์ pom ใหม่เพื่อกำหนด metadata เพื่อช่วยตัวคุณเองในปัญหาเหล่านี้ฉันขอแนะนำให้ใช้mvn install:install-fileแล้วคัดลอกโครงสร้างไดเรกทอรีทั้งหมดจากที่เก็บในเครื่องของคุณไปยังที่เก็บในโครงการของคุณ
Isen Ng

33

สิ่งนี้สามารถทำได้อย่างง่ายดายโดยใช้องค์ประกอบ <scope> ที่ซ้อนกันอยู่ภายในองค์ประกอบ <dependency>

ตัวอย่างเช่น:

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

การอ้างอิง: http://www.tutorialspoint.com/maven/maven_external_dependencies.htm


วิธีนี้ใช้ได้ดีมากเมื่อคุณมี Eclipse Embedded Maven เท่านั้นและคุณไม่มีปลั๊กอินติดตั้ง (ระบบออฟไลน์) ดังนั้นคุณจึงไม่สามารถเรียกใช้installเป้าหมายในโครงการที่พึ่งพาได้ Ofc มีระบบ airgapped และมีปลั๊กอินทั้งหมด แต่ติดตั้งปลั๊กอินค่อนข้างเป็นสถานการณ์ที่หายาก
Cardin Lee JH

1
สะอาดและง่ายที่สุด
Ajay Kumar

วิธีเพิ่มเส้นทางการพึ่งพาในท้องถิ่นซึ่งอยู่นอกโฟลเดอร์ $ {project.basedir} เช่นฉันต้องการ $ {basedir} \ src \ lib \ ldapjdk.jar เส้นทาง 1 ระดับขึ้นไปในโฟลเดอร์อื่น
Naveen Kumar

ฉันได้รับข้อผิดพลาด -"The POM for … is missing, no dependency information available” even though it exists in Maven Repository
garg10 พฤษภาคม

28

คู่มือ Maven บอกว่าจะทำสิ่งนี้:

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

4
คำสั่งนี้ติดตั้ง lib ลงใน repo maven ของคุณ ข้อเสียคือถ้าคุณพยายามทำงานในโครงการในคอมพิวเตอร์เครื่องอื่นคุณต้องเรียกใช้งานอีกครั้ง
Charlie Wu

25

อัปเดตเราเพิ่งติดตั้งเซิร์ฟเวอร์ Nexus ของเราเองง่ายขึ้นและสะอาดขึ้น

ที่ บริษัท ของเราเรามีไหที่มีขวดทั่วไป แต่ไม่ได้โฮสต์ในที่เก็บ Maven ใด ๆ และเราไม่ต้องการให้มีที่เก็บในท้องที่ เราสร้าง repo mvn (สาธารณะ) ที่ง่ายมากบน Github (แต่คุณสามารถโฮสต์ไว้บนเซิร์ฟเวอร์หรือในเครื่อง):
โปรดทราบว่านี่เป็นวิธีที่เหมาะสำหรับการจัดการไฟล์ jar chaning ที่หายาก

  1. สร้าง repo บน GitHub:
    https://github.com/<user_name>/mvn-repo/

  2. เพิ่มพื้นที่เก็บข้อมูลใน pom.xml
    (โปรดทราบว่าไฟล์ดิบเส้นทางแบบเต็มจะแตกต่างจากชื่อ repo เล็กน้อย)

    <repository>
        <id>project-common</id>
        <name>Project Common</name>
        <url>https://github.com/<user_name>/mvn-repo/raw/master/</url>
    </repository>
  3. เพิ่มการพึ่งพาไปยังโฮสต์ (Github หรือเซิร์ฟเวอร์เอกชน) สิ่งที่คุณต้องรู้ก็คือไฟล์จะถูกจัดเก็บในรูปแบบที่ระบุโดย @glitch b บนโฮสต์ของคุณสร้างโฟลเดอร์เพื่อให้ตรงกับรูปแบบนี้ เช่นถ้าคุณมีไฟล์ jar ชื่อสร้างโฟลเดอร์และวางไฟล์ jar ไว้ ค. ทดสอบโดยพยายามดาวน์โหลด jar จากเบราว์เซอร์ (ในกรณีของเรา:

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

    service-sdk-0.0.1.jarservice-sdk/service-sdk/0.0.1/service-sdk-0.0.1.jar
    https://github.com/<user_name>/mvn-repo/raw/master/service-sdk/service-sdk/0.0.1/service-sdk-0.0.1.jar

  4. เพิ่มการพึ่งพาไฟล์ pom.xml ของคุณ:

    <dependency>
        <groupId>service-sdk</groupId>
        <artifactId>service-sdk</artifactId>
        <version>0.0.1</version>
    </dependency>
  5. สนุก


ดีว่าเป็นโซลูชั่นที่ยืดหยุ่นที่สุดที่ผมเคยพบขอบคุณ
ชาร์ลีวู

11

อย่าใช้ systemPath ตรงกันข้ามกับสิ่งที่ผู้คนพูดที่นี่คุณสามารถวางไหภายนอกในโฟลเดอร์ภายใต้ไดเรกทอรีโครงการที่เช็คเอาท์ของคุณและ Maven ก็พบว่ามันเหมือนกับการอ้างอิงอื่น ๆ นี่คือสองขั้นตอนสำคัญ:

  1. ใช้ "mvn ติดตั้ง: install-file" ด้วย -DlocalRepositoryPath
  2. กำหนดค่าที่เก็บให้ชี้ไปที่เส้นทางนั้นใน POM ของคุณ

มันค่อนข้างตรงไปตรงมาและคุณสามารถหาตัวอย่างทีละขั้นตอนได้ที่นี่: http://randomizedsort.blogspot.com/2011/10/configuring-maven-to-use-local-library.html


8

Maven วิธีการเพิ่มไห maven ไม่ใช่โครงการ maven

โครงการ Maven และไห Maven ไม่ใช่

เพิ่มปลั๊กอินการติดตั้ง maven ในส่วนการสร้างของคุณ

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

เพิ่มการพึ่งพา

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

การอ้างอิงหมายเหตุฉันเป็นเจ้าของบล็อก


คุณรู้จักเวอร์ชั่นของ jars และปลั๊กอินติดตั้ง maven ได้อย่างไร?
osk

ไหรุ่นใหม่ถูกสร้างขึ้นแล้วปลั๊กอินติดตั้ง maven เป็นเวอร์ชั่นล่าสุด
craftsmannadeem

7

หากคุณพบปัญหาเดียวกันและกำลังใช้ spring-boot v1.4 +คุณสามารถทำได้ด้วยวิธีนี้

มีincludeSystemScopeที่คุณสามารถใช้เพื่อเพิ่มการพึ่งพาขอบเขตระบบให้กับ jar

เช่น

ฉันใช้ oracle driver กับโครงการของฉัน

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

จากนั้นให้ includeSystemScope = true เพื่อรวม jar ลงในพา ธ / BOOT-INF / lib / **

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

และแยกออกจากทรัพยากรเพื่อหลีกเลี่ยงการซ้ำซ้อนรวมขวดมีไขมันเพียงพอ ~

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

โชคดี!


ฉันกำลังมองหาวิธีแก้ปัญหาเช่นนี้เพียงเพราะเมื่อนักพัฒนาใหม่มาถึงขั้นตอนการติดตั้งก็ง่ายขึ้น เมื่อคุณไม่มีเซิร์ฟเวอร์วัตถุวิธีที่ง่ายกว่าคือการพึ่งพาแบบกำหนดเองในโครงการของคุณ นอกจากนี้เมื่อคุณใช้ CI โซลูชันนี้หลีกเลี่ยงการติดตั้ง jar ด้วยตนเองบนเซิร์ฟเวอร์ CI
Dalc

ไหหลาย ๆ ขวดล่ะ ??
mithun_ghose

4

คุณสามารถเปลี่ยนsystemPath

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

3

pom.xml กำลังดูที่เก็บในเครื่องของคุณเพื่อลองและค้นหาการพึ่งพาที่ตรงกับสิ่งประดิษฐ์ของคุณ นอกจากนี้คุณไม่ควรใช้ขอบเขตระบบหรือคุณลักษณะ systemPath จริง ๆ แล้วสงวนไว้สำหรับสิ่งที่อยู่ใน JDK ไม่ใช่ JRE

ดูคำถามนี้สำหรับวิธีการติดตั้งสิ่งประดิษฐ์ maven


3

โปรดทราบว่าตัวอย่างทั้งหมดที่ใช้

<repository>...</respository> 

ต้องใช้ภายนอก

<repositories>...</repositories> 

แท็กที่ล้อมรอบ มันไม่ชัดเจนจากตัวอย่างบางส่วน


2

ทางออกที่ดีที่สุดที่นี่คือการติดตั้งที่เก็บ: Nexus หรือสิ่งประดิษฐ์ หากให้สถานที่ที่จะวางสิ่งนี้และเร่งมันให้เร็วขึ้นโดยการแคชสิ่งของของคุณจากด้านนอก

หากสิ่งที่คุณกำลังเผชิญคือโอเพนซอร์ซคุณอาจลองใส่เข้าไปในส่วนกลาง

ดูคู่มือ


1

ด้วย Eclipse Oxygen คุณสามารถทำสิ่งต่าง ๆ ด้านล่าง:

  1. วางไลบรารีของคุณใน WEB-INF / lib
  2. โครงการ -> กำหนดค่า Build Path -> เพิ่ม Library -> Library Web App

Maven จะพาพวกเขาไปเมื่อติดตั้งโครงการ


3
ถ้าฉันทำผู้ใช้อื่นที่ดึงโครงการของฉันต้องทำเช่นเดียวกันใน Eclipse หรือไม่?
cruxi

0

หากไหภายนอกถูกสร้างขึ้นโดยโครงการ Maven เท่านั้นคุณสามารถคัดลอกโครงการทั้งหมดในระบบของคุณและเรียกใช้

mvn install

ในไดเรกทอรีโครงการ สิ่งนี้จะเพิ่ม jar ลงในไดเร็กทอรี. m2 ซึ่งเป็นที่เก็บ maven โลคัล

ตอนนี้คุณสามารถเพิ่ม

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

สิ่งนี้จะทำให้คุณมั่นใจ

mvn exec:java 

โรงงาน ถ้าคุณใช้แนะนำที่นี่

<scope>system</scope>

จากนั้นคุณจะต้องเพิ่มคลาสทีละรายการโดยใช้การดำเนินการผ่านบรรทัดคำสั่ง

คุณสามารถเพิ่มไหภายนอกโดยคำสั่งต่อไปนี้อธิบายไว้ที่นี่

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

0

วิธีที่มีประสิทธิภาพและสะอาดที่สุดที่ฉันพบเพื่อจัดการกับปัญหานี้คือการใช้แพ็คเกจ Github

  1. สร้างพื้นที่เก็บข้อมูลสาธารณะ / ส่วนตัวที่ว่างเปล่าอย่างง่ายบน GitHub ตามความต้องการของคุณไม่ว่าคุณต้องการให้ไหภายนอกของคุณเป็นโฮสต์สาธารณะหรือไม่

  2. รันคำสั่ง maven ด้านล่างเพื่อปรับใช้ jar ภายนอกของคุณในที่เก็บ github ด้านบนที่สร้างขึ้น

    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

    ดังกล่าวข้างต้นจะปรับคำสั่งคุณขวดภายนอกในพื้นที่เก็บข้อมูล GitHub -Durl=กล่าวถึงใน คุณสามารถอ้างอิงลิงค์นี้เกี่ยวกับวิธีการปรับใช้การพึ่งพาเป็นแพคเกจGitHub สอนการปรับใช้แพคเกจ GitHub

  3. หลังจากที่คุณสามารถเพิ่มการพึ่งพาการใช้groupId, artifactIdและversionกล่าวถึงในขั้นตอนข้างต้นใน Maven pom.xmlและเรียกใช้mvn install

  4. Maven จะดึงการอ้างอิงของไหภายนอกจากรีจิสทรีแพคเกจ GitHub และจัดทำในโครงการ Maven ของคุณ

  5. สำหรับการทำงานคุณจะต้องกำหนดค่า maven ของคุณsettings.xmlเพื่อดึงข้อมูลจากรีจิสทรี GitHub Package

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