จะเพิ่มไฟล์ jar ในเครื่องให้กับโครงการ Maven ได้อย่างไร


1171

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


1
สวัสดี @Praneel PIDIKITI คุณช่วยเปลี่ยนคำตอบที่ตอบรับด้วยคะแนนมากที่สุดได้ไหม?
null

1
@nslntmnx นั่นไม่ใช่วิธีที่ดีกว่าเนื่องจากโซลูชันทั้งหมดมีข้อบกพร่องstackoverflow.com/questions/364114/…
Paul Verest

หาก libs คุณมีการปรับปรุงหรือขยายในโอกาสเห็นคำตอบนี้ไปผมต้องการที่จะโหลดไหทั้งหมดจาก libs ของฉันโครงการโฟลเดอร์ที่มี Mavenสำหรับ "pomified" วิธีการหลีกเลี่ยงและเช่นโฟลเดอร์ repo เพิ่มเติมและยุ่งยากสาย cmd หรือinstall-fileสคริปต์
GeroldBroser คืนสถานะโมนิก้า

คำตอบ:


698

ติดตั้ง JAR ในที่เก็บ Maven ท้องถิ่นของคุณดังนี้:

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

แต่ละที่อ้างถึง:

<path-to-file>: พา ธ ไปยังไฟล์ที่จะโหลดเช่น→ c:\kaptcha-2.3.jar

<group-id>: กลุ่มที่ควรลงทะเบียนไฟล์ภายใต้เช่น→ com.google.code

<artifact-id>: ชื่อสิ่งประดิษฐ์สำหรับไฟล์เช่น→ kaptcha

<version>: เวอร์ชันของไฟล์เช่น→ 2.3

<packaging>: บรรจุภัณฑ์ของไฟล์เช่น→ jar

การอ้างอิง


7
คำแนะนำในการติดตั้งบนบิลด์ของฉันมีทุกอย่างยกเว้นส่วน generatePom ที่ดูเหมือนจะมีความสำคัญ
Jason D

4
<path-to-file> มันหมายความว่าอะไร? เช่น C: /Users/XXX/WorkspaceDocx/maven/src/main/resources/myJar.jar ...... หรือเราสามารถทำ $ {project.basedir} /src/main/resources/myJar.jar
Igor Beaufils

17
คำตอบนั้นไม่ได้พูดถึง README หรือว่าไหนั้นถูกนำมาใช้ อย่างไรก็ตามหากโครงการนำไหมาด้วยคุณอาจใส่ repo ไว้ในโครงการตามที่กล่าวไว้ที่นี่stackoverflow.com/a/36602256/1000011ดังนั้นคุณไม่จำเป็นต้องใช้ README เพราะโครงการจะทำงานเหมือนไห อยู่ใน Maven Central โดยไม่มีขั้นตอนใด ๆ เป็นพิเศษ
opticyclic

8
@opticyclic ความคิดเห็นของคุณต้องการ upvotes มากขึ้นหรือคำตอบนี้จำเป็นต้องแก้ไข มันเป็นสูตรสำหรับภัยพิบัติสำหรับมือใหม่ที่ไม่ทราบว่าการติดตั้ง Repo Maven ในพื้นที่จะไม่รวมสำหรับคนอื่น
Mike S


1427

คุณสามารถเพิ่มการพึ่งพาในท้องถิ่นโดยตรง (ดังที่กล่าวไว้ในโครงการสร้าง maven พร้อมห้องสมุดที่เป็นกรรมสิทธิ์ ) เช่นนี้:

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

ปรับปรุง

ในรุ่นใหม่คุณสมบัตินี้ถูกทำเครื่องหมายว่าเลิกใช้แล้ว แต่ยังใช้งานได้และยังไม่ถูกลบออก (คุณเพิ่งเห็นคำเตือนในบันทึกระหว่างการเริ่มต้น Maven) เกิดปัญหาขึ้นที่กลุ่ม maven เกี่ยวกับเรื่องนี้ https://issues.apache.org/jira/browse/MNG-6523 (คุณสามารถเข้าร่วมและอธิบายได้ว่าเหตุใดคุณลักษณะนี้จึงมีประโยชน์ในบางกรณี) ฉันหวังว่าคุณสมบัตินี้จะยังคงอยู่!

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


49
มีหลายครั้งที่คุณต้องการทดสอบขวดเก่าโดยเฉพาะและฉันคิดว่าคำตอบนี้เหมาะสำหรับสิ่งนั้น มันคือสิ่งที่ฉันต้องการ โหวตขึ้น
John Lockwood

36
ดูดีและใช้งานง่ายโซลูชันนี้มีปัญหาที่ yourJar.jar จะไม่รวมอยู่ในไฟล์ WAR สำหรับแอปของคุณ
แมทเทียส

40
วิธีการแก้ปัญหาข้างต้นไม่ทำงานอีกต่อไปมันกลับมา: "'dependencies.dependency.systemPath' สำหรับ xx.jar ไม่ควรชี้ไปที่ไฟล์ในไดเรกทอรีโครงการ" นี่เป็นการจัดการในstackoverflow.com/questions/10935135/ …
sarah .ferguson

8
ในคำตอบนี้ไม่ใช่วิธีผิดartifactIdและgroupIdผิดใช่ไหม
theonlygusti

5
อ้างอิงจาก Maven docu ( maven.apache.org/guides/introduction/ … ): หมายเหตุสำคัญ: สิ่งนี้ถูกทำเครื่องหมายว่าเลิกใช้แล้ว
agassner

142

ประการแรกฉันต้องการให้เครดิตสำหรับคำตอบนี้กับผู้ใช้ที่ไม่ระบุชื่อ Stack Overflow - ฉันค่อนข้างแน่ใจว่าฉันเคยเห็นคำตอบที่คล้ายกันที่นี่มาก่อน - แต่ตอนนี้ฉันไม่พบมัน

ตัวเลือกที่ดีที่สุดสำหรับการมีไฟล์ JAR ในพื้นที่เป็นการอ้างอิงคือการสร้างที่เก็บ Maven แบบโลคัล พื้นที่เก็บข้อมูลดังกล่าวไม่มีอะไรมากไปกว่าโครงสร้างไดเรกทอรีที่เหมาะสมพร้อมไฟล์ pom ในนั้น

สำหรับตัวอย่างของฉัน: ฉันมีโครงการหลักของฉันเกี่ยวกับ${master_project}สถานที่และ subproject1 ${master_project}/${subproject1}อยู่บน

แล้วฉันจะสร้างพื้นที่เก็บข้อมูล Maven ${master_project}/local-maven-repoใน:

ในไฟล์ pom ใน subproject1 ซึ่งตั้งอยู่ที่ที่${master_project}/${subproject1}/pom.xmlเก็บจะต้องมีการระบุซึ่งจะพาเส้นทางไฟล์เป็นพารามิเตอร์ URL:

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

การพึ่งพาสามารถระบุว่าเป็นที่เก็บอื่น ๆ สิ่งนี้ทำให้ที่เก็บ pom ของคุณเป็นอิสระ ตัวอย่างเช่นเมื่อ JAR ที่ต้องการพร้อมใช้งานใน Maven central คุณเพียงแค่ต้องลบมันออกจาก repo ท้องถิ่นของคุณและมันจะถูกดึงออกจาก repo เริ่มต้น

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

สิ่งสุดท้ายที่ต้องทำคือการเพิ่มไฟล์ JAR ไปยังที่เก็บในเครื่องโดยใช้สวิตช์ -DlocalRepositoryPath ดังนี้:

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

เมื่อติดตั้งไฟล์ JAR แล้ว Maven repo ของคุณสามารถกำหนดให้เป็นที่เก็บรหัสได้และการตั้งค่าทั้งหมดไม่ขึ้นกับระบบ ( ตัวอย่างการทำงานใน GitHub )

ฉันยอมรับว่าการมี JARs มุ่งมั่นที่จะ repo ซอร์สโค้ดไม่ใช่วิธีปฏิบัติที่ดี แต่ในชีวิตจริงการแก้ปัญหาที่รวดเร็วและสกปรกบางครั้งก็ดีกว่า Nexus repo ที่เป่าเต็มเพื่อโฮสต์ JAR หนึ่งตัวที่คุณไม่สามารถเผยแพร่ได้


ไดเรกทอรีญาติในท้องถิ่นเป็น repo maven ... ช่วยได้มาก
sura2k

4
หากคุณต้องการทำสิ่งนี้ใน pom.xml ให้ตรวจสอบbaeldung.com/install-local-jar-with-maven
Kai Wang

@Kai Wang วิธีนี้ใช้งานได้ดีกว่า! คุณอาจจะเพิ่มนี่เป็นคำตอบ
lockwobr

7
ตั้งแต่${project.parent.basedir}ดูเหมือนจะไม่แก้ไขอะไรในปัจจุบันผมใช้${project.basedir}/..และทำงานได้อย่างสมบูรณ์แบบ
The Impaler

1
คำแนะนำ: โปรดตรวจสอบ $ HOME / .m2 / settings.xml, หลีกเลี่ยง "local-maven-repo" ถูกทำมิเรอร์โดยการตั้งค่า / มิเรอร์ / มิเรอ <mirrorOf>*</mirrorOf>ร์
btpka3

125

สร้างโฟลเดอร์ใหม่สมมติว่าlocal-maven-repoรากของโครงการ Maven ของคุณ

เพียงเพิ่ม repo ในพื้นที่<project>ของคุณpom.xml:

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

จากนั้นสำหรับแต่ละ jar ภายนอกที่คุณต้องการติดตั้งให้ไปที่รูทของโครงการและดำเนินการ:

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
นี่เป็นคำตอบเดียวที่ถูกต้องที่นี่เนื่องจากมันจะสร้าง repo ของคุณอย่างถูกต้องเมื่อใช้การปรับใช้
opticyclic

วิธีการนี้จะใช้งานได้หรือไม่หากรหัสถูกปรับใช้โดยใช้ CI บิลด์เซิร์ฟเวอร์ ดูเหมือนว่าการสร้างอัตโนมัติจะไม่สามารถเข้าถึงการพึ่งพาได้
Wallace Howery

2
@ user2748659 ใช่ถ้าใน CI บิลด์เซิร์ฟเวอร์ของคุณlocal-maven-repoจะมีโฟลเดอร์รวมอยู่ (เหมือนเด็ก ๆ ในตัวอย่างนี้) ในโฟลเดอร์ซอร์สของคุณ
Anthony O.

3
คำตอบนี้เป็นสิ่งที่ทำงานสำหรับฉัน สำหรับโครงการที่ใช้ร่วมกันการมี repo ในไดเรกทอรีโครงการและเพิ่มลงในการควบคุมเวอร์ชันทำให้แน่ใจว่าทุกคนที่ตรวจสอบโครงการจะไม่ขาดการพึ่งพา หากคุณมีการพึ่งพาจำนวนมากดังนั้น repo ระยะไกลที่ใช้ร่วมกันอาจเป็นทางออกที่ดีกว่ามิฉะนั้นการเก็บรักษา repo ไว้ในไดเรกทอรีของโครงการนั้นสมบูรณ์แบบ
Aquarelle

2
โปรดทราบว่าในการทำเช่นนี้คุณอาจต้องเพิ่ม -Dpackaging = jar มิฉะนั้นคุณจะได้รับ "ข้อมูลสิ่งประดิษฐ์ไม่สมบูรณ์หรือไม่ถูกต้อง: ไม่มีบรรจุภัณฑ์"
J Woodchuck

43

ฉันต้องการโซลูชันดังกล่าว - ใช้maven-install-pluginในไฟล์ 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>

ในกรณีนี้คุณสามารถดำเนินการmvn initializeและ jar จะถูกติดตั้งใน repo maven ท้องถิ่น ตอนนี้ jar นี้พร้อมใช้งานในระหว่างขั้นตอน maven ใด ๆ บนเครื่องนี้ (อย่าลืมรวมการพึ่งพานี้เป็นการพึ่งพา maven อื่น ๆ ใน pom ด้วย<dependency></dependency>แท็ก) นอกจากนี้ยังเป็นไปได้ที่จะผูกติดตั้ง jar ไม่เป็นinitializeขั้นตอน แต่เป็นขั้นตอนอื่นที่คุณต้องการ


2
สิ่งนี้ใช้ได้ดีสำหรับฉัน แต่ถ้าฉันเรียกใช้mvn initializeก่อนหน้านี้mvn package: ฉันไม่สามารถทำได้mvn initialize packageหรือไม่ก็พยายามดาวน์โหลด JAR จาก repo ส่วนกลาง ทำไมนี้ ฉันคิดว่ามันจะทำงานตามเป้าหมาย / ขั้นตอนนี้ตามลำดับ
DavidS

1
ที่จริงแล้วพวกเขาควรจะทำงานตามลำดับ ดูรายการวงจรชีวิตเริ่มต้น: maven.apache.org/guides/introduction/ ......คุณสามารถใช้ขั้นตอนอื่นในการผูก
sphinks

2
ฉันลองทุกวิธี แต่ในที่สุดฉันต้องใช้วิธีนี้ เหตุผลหลักคือฉันต้องการที่จะสามารถสร้างแพคเกจในโหมดออฟไลน์ ถ้าฉันประกาศว่ามันขึ้นอยู่กับพื้นที่เก็บข้อมูลที่กำหนดไว้ในพื้นที่สิ่งนี้ถือเป็นเพียง repo ออนไลน์อื่นและตัวสร้าง maven บ่นเกี่ยวกับการไม่ปรับสิ่งประดิษฐ์ วิธีนี้ใช้ได้ผลดีกับทุกกรณี
Mauli

2
ฉันคิดว่าดีกว่าที่จะใช้ขั้นตอนที่สะอาดเพราะการเริ่มต้นจะถูกดำเนินการทุกครั้งเมื่อเราใช้แพ็คเกจ mvn เมื่อมันไม่จำเป็น สุดท้ายหากเราจะต้องสร้างขวด / สงครามเราสามารถใช้โดยตรงแพคเกจที่สะอาด mvn
Deoxyseia

" นอกจากนี้ยังเป็นไปได้ที่จะผูกติดตั้ง jar ไม่ให้เริ่มต้นขั้นตอน แต่ขั้นตอนอื่น ๆ ที่คุณต้องการ " ไม่จำเป็นต้องเป็นเรื่องจริง หากการพึ่งพาไม่ได้อยู่ใน repo เลยและมีการใช้เฟสที่มาหลังจากเฟสที่แก้ไขการพึ่งพา (เช่นcompile) บิลด์จะล้มเหลว
GeroldBroser คืนสถานะโมนิก้า

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>systemเลิกใช้แล้วในขณะนี้
GeroldBroser คืนสถานะโมนิก้า

@ GeroldBroser - ตกลง เราสามารถใช้อะไรแทนสิ่งนั้นได้?
MasterJoe2

2
@ MasterJoe2 ขณะที่ยังกล่าวถึงในคำตอบที่ได้รับการยอมรับ install:install-fileสิ่งประดิษฐ์ที่จะซื้อคืนในท้องถิ่นและใช้มันเป็น "ปกติ" การพึ่งพา (มีขอบเขตเริ่มต้นcompile) หรือใช้วิธีการแก้ปัญหาพื้นที่เก็บข้อมูลในโครงการ
GeroldBroser คืนสถานะโมนิก้า


14

วิธีที่รวดเร็วและสกปรกจริงๆคือการชี้ไปที่ไฟล์ในเครื่อง:

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

อย่างไรก็ตามสิ่งนี้จะอยู่บนเครื่องของคุณเท่านั้น (เห็นได้ชัด) สำหรับการแบ่งปันมันมักจะเหมาะสมที่จะใช้การจัดเก็บ m2 ที่เหมาะสม (Nexus / วัตถุโบราณ) หรือถ้าคุณไม่มีสิ่งเหล่านี้หรือไม่ต้องการตั้งค่า Maven ท้องถิ่น โครงสร้างที่เก็บถาวรและกำหนดค่า "พื้นที่เก็บข้อมูล" ใน pom ของคุณ: ท้องถิ่น:

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

ระยะไกล:

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

สำหรับเส้นทางสัมพัทธ์นี้ยังสามารถใช้ตัวแปรเบสได้ด้วย:

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

สำหรับ URL ที่เก็บในเครื่องพวกเขาสามารถเป็นญาติหรือพวกเขาจะต้องสมบูรณ์?
Dragas

@Dragas ฉันไม่ได้ลองโปรดแจ้งให้เราทราบหากคุณทำ
fl0w

1
ใช่แน่นอนคุณต้องใช้<url>file:${basedir}</url>เป็น URL พื้นฐานแทน
Dragas

11

เพิ่ม JAR ในเครื่องของคุณในไฟล์ POM และใช้มันใน maven build

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

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

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

จากนั้นเพิ่มลงใน POM ดังนี้:

ป้อนคำอธิบายรูปภาพที่นี่


ฉันได้รับข้อผิดพลาดไม่สามารถติดตั้งสิ่งประดิษฐ์ (ปฏิเสธการเข้าถึง) ฉันจะแก้ปัญหานี้ได้อย่างไร @Aurasphere
Ramzah Rehman

1
@RamzahRehman ลองเปิดพรอมต์คำสั่งพร้อมสิทธิ์ admi โดยคลิกขวาจากนั้นเลือก "Run as administrator"
Aurasphere

9

วิธีหนึ่งคือการอัปโหลดไปยังผู้จัดการพื้นที่เก็บข้อมูล Maven ของคุณเอง (เช่น Nexus) เป็นการดีที่จะมีผู้จัดการพื้นที่เก็บข้อมูลของตัวเองอยู่แล้ว

อีกวิธีที่ดีที่ฉันเห็นเมื่อเร็ว ๆ นี้คือการรวมปลั๊กอินการติดตั้ง Maven ในวงจรชีวิตการสร้างของคุณ: คุณประกาศใน POM เพื่อติดตั้งไฟล์ไปยังที่เก็บในเครื่อง เป็นค่าใช้จ่ายเล็กน้อย แต่มีขนาดเล็กและไม่มีขั้นตอนที่ต้องทำด้วยตนเอง

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


4
จบลงด้วยการเปลี่ยนเป็นไล่ระดับ มันไม่ทำงานหาก jar ในเครื่องถูกกำหนดให้เป็นการพึ่งพา maven จะไม่เรียกใช้งานปลั๊กอินก่อนที่จะแก้ไขการพึ่งพาการติดตั้งด้วยตนเองจะไม่สามารถหลีกเลี่ยงได้ พบความสับสนเกี่ยวกับสถานการณ์นี้: stackoverflow.com/questions/5951999/…
xinthink

7

แน่นอนคุณสามารถเพิ่มไหลงในโฟลเดอร์นั้นได้ แต่บางทีมันอาจไม่ใช่สิ่งที่คุณต้องการเพื่อให้บรรลุ ...

หากคุณต้องการขวดเหล่านี้สำหรับการรวบรวมตรวจสอบคำถามที่เกี่ยวข้องนี้: ฉันสามารถเพิ่มไหใน maven 2 build classpath โดยไม่ต้องติดตั้งได้ไหม

นอกจากนี้ก่อนใครแนะนำให้ใช้อย่าใช้ขอบเขตระบบ


6

อีกกรณีที่น่าสนใจคือเมื่อคุณต้องการมีขวด maven ส่วนตัวของโครงการ คุณอาจต้องการรักษาความสามารถของ Maven เพื่อแก้ไขการพึ่งพาสกรรมกริยา การแก้ปัญหาค่อนข้างง่าย

  1. สร้างlibsโฟลเดอร์ในโครงการของคุณ
  2. เพิ่มบรรทัดต่อไปนี้ในไฟล์ pom.xml ของคุณ

    <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. เปิดโฟลเดอร์. m2 / repositoryและคัดลอกโครงสร้างไดเรกทอรีของโครงการที่คุณต้องการนำเข้าสู่โฟลเดอร์libs

เช่นสมมติว่าคุณต้องการนำเข้าการอ้างอิง

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

เพียงไปที่. m2 / พื้นที่เก็บข้อมูลแล้วคุณจะเห็นโฟลเดอร์ต่อไปนี้

co.th / MyCompany / MyProject / 1.2.3

คัดลอกทุกอย่างในโฟลเดอร์ libs ของคุณ (รวมถึงโฟลเดอร์ภายใต้. m2 / พื้นที่เก็บข้อมูล ) และคุณทำเสร็จแล้ว


6

บรรทัดคำสั่ง :

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

5

ส่วนที่สำคัญในการพึ่งพาคือ: $ {pom.basedir} (แทนที่จะเป็นแค่ $ {basedir})

<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

ฉันคิดว่าทางออกที่ดีกว่าสำหรับปัญหานี้คือการใช้maven-install-pluginเพื่อติดตั้งไฟล์โดยอัตโนมัติในเวลาติดตั้ง นี่คือวิธีที่ฉันตั้งค่าสำหรับโครงการของฉัน

ก่อนอื่นให้เพิ่มพา ธ (ที่คุณเก็บ. jars ในเครื่อง) ไว้เป็นคุณสมบัติ

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

จากนั้นภายใต้pluginsเพิ่มปลั๊กอินเพื่อติดตั้งขวดเมื่อรวบรวม

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

ในที่สุดในการพึ่งพาคุณสามารถเพิ่มขวด

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

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

สำหรับ groupIdใช้ชื่อเฉพาะเพื่อให้แน่ใจว่าไม่มีข้อขัดแย้ง

ตอนนี้เมื่อคุณmvn installหรือmvn testขวดท้องถิ่นจะถูกเพิ่มโดยอัตโนมัติ


3

วิธีที่ต้องการคือการสร้างที่เก็บระยะไกลของคุณเอง

ดูที่นี่สำหรับรายละเอียดเกี่ยวกับวิธีการทำ ดูที่ส่วน ' การอัปโหลดไปยังที่เก็บข้อมูลระยะไกล '


3

ฉันต้องการแชร์รหัสที่คุณสามารถอัปโหลดโฟลเดอร์ที่เต็มไปด้วยไห มันมีประโยชน์เมื่อผู้ให้บริการไม่มีที่เก็บสาธารณะและคุณต้องเพิ่มห้องสมุดจำนวนมากด้วยตนเอง ฉันตัดสินใจสร้าง. bat แทนการโทรโดยตรงไปยัง Maven เพราะอาจเป็นข้อผิดพลาดหน่วยความจำไม่เพียงพอ มันจัดทำขึ้นสำหรับสภาพแวดล้อม windows แต่ง่ายต่อการปรับให้เข้ากับระบบปฏิบัติการ 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();
    }

}

หลังจากรัน main นี้จาก IDE ใด ๆ ให้รัน update_repo_maven.bat


String symbolicName = attributes.getValue("Bundle-SymbolicName"); if(symbolicName!=null &&symbolicName.contains("com.yourCompany.yourProject"))ดูเหมือนว่ารหัสของคุณจะระบุว่ารองรับไหที่กำหนดเองเท่านั้น นั่นไม่ใช่สิ่งที่เราต้องการ: แทนที่จะเป็นไหของบุคคลที่สาม คุณมีคำแนะนำวิธีการติดตั้งjar ใด ๆด้วยวิธีนี้หรือไม่?
javadba

ฉันได้แก้ไขรหัสของคุณ: ฉันใส่คำตอบที่ด้านล่าง
javadba

3

นี่เป็นไวยากรณ์สั้น ๆ สำหรับเวอร์ชันที่ใหม่กว่า:

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

มันทำงานได้เมื่อ JAR ถูกสร้างโดย Apache Maven - กรณีที่พบบ่อยที่สุด จากนั้นจะมี pom.xml ในโฟลเดอร์ย่อยของไดเรกทอรี META-INF ซึ่งจะอ่านตามค่าเริ่มต้น

ที่มา: http://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html


2

ดูที่ ...

<scope>compile</scope>

Maven อ้างอิง นี่เป็นค่าเริ่มต้น แต่ฉันได้พบในบางกรณีการตั้งค่าขอบเขตนั้นยัง Maven อย่างชัดเจนเพื่อค้นหาไลบรารีท้องถิ่นในที่เก็บภายในเครื่อง


2

ด้วยเหตุผลบางอย่างในโปรแกรมเว็บฉันให้การบำรุงรักษาเพื่อไม่แก้ปัญหา Alireza Fattahi ของมิได้แก้ปัญหา JJ โรมันทำงานได้อย่างถูกต้อง ในทั้งสองกรณีการรวบรวมจะไม่เป็นไร (เห็นขวด) แต่บรรจุภัณฑ์ไม่สามารถรวมขวดไว้ในสงครามได้

วิธีเดียวที่ฉันจัดการเพื่อให้มันทำงานได้โดยการวางขวด/src/main/webapp/WEB-INF/lib/แล้วรวมกับโซลูชันของ Fattahis หรือ Roman


1

โปรดทราบว่าไม่จำเป็นต้องใช้ repo ในพื้นที่ ถ้าโปรเจ็กต์นี้ถูกแชร์กับผู้อื่นดังนั้นทุกคนจะมีปัญหาและคำถามเมื่อมันไม่ทำงานและ jar จะไม่สามารถใช้งานได้แม้ในระบบควบคุมแหล่งที่มาของคุณ!

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


1
หากคุณเพิ่มเหยือกในระบบควบคุมแหล่งข้อมูลไลบรารีจะพร้อมใช้งานกับแหล่งข้อมูลเสมอ ไม่มีแหล่งที่มาไม่มีห้องสมุด ด้วย maven แทนแหล่งที่มาอาจใช้ได้ แต่ที่เก็บไม่พร้อมใช้งาน
sarah.ferguson

@Frank ... มีความคิดเกี่ยวกับวิธีสร้าง jar ที่ใช้งานได้โดยไม่รวมการพึ่งพาจากภายนอก (ไฟล์ไลบรารี)
Satish Karuturi

สำหรับผู้ที่ยังใหม่ต่อการหลอกลวงและกำลังมองหาคำตอบสำหรับคำถามต้นฉบับการฝังขวดหมายความว่าอะไร?
cdock

1

บนพื้นที่เก็บข้อมูลในพื้นที่ของคุณคุณสามารถติดตั้ง jar ของคุณโดยใช้คำสั่ง

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

ตามลิงค์ที่มีประโยชน์นี้ เพื่อทำสิ่งเดียวกันจากเว็บไซต์ของ mkyoung นอกจากนี้คุณยังสามารถตรวจสอบคู่มือ Maven สำหรับเดียวกัน


1

ในการติดตั้ง jar ของบุคคลที่สามกรุณาโทรคำสั่งดังต่อไปนี้

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

1
  1. mvn ติดตั้ง

คุณสามารถเขียนโค้ดด้านล่างในบรรทัดคำสั่งหรือหากคุณใช้ eclipse builtin maven คลิกขวาที่โครงการ -> เรียกใช้เป็น -> เรียกใช้การกำหนดค่า ... -> ในแผงด้านซ้ายคลิกขวาบน Maven Build -> การกำหนดค่าใหม่ -> เขียน รหัสในเป้าหมาย & ในไดเรกทอรีฐาน: $ {project_loc: NameOfYourProject} -> Run

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

แต่ละที่อ้างถึง:

<path-to-file>: พา ธ ไปยังไฟล์ที่จะโหลดเช่น -> c: \ kaptcha-2.3.jar

<group-id>: กลุ่มที่ควรลงทะเบียนไฟล์ภายใต้เช่น -> com.google.code

<ifact-id>: ชื่อสิ่งประดิษฐ์สำหรับไฟล์เช่น -> kaptcha

<version>: เวอร์ชันของไฟล์เช่น -> 2.3

<Packaging>: บรรจุภัณฑ์ของไฟล์เช่น -> jar

2. หลังจากติดตั้งแล้วให้ประกาศ jar ใน pom.xml

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

1

ขั้นตอนที่ 1:กำหนดค่าmaven-install-pluginโดยมีเป้าหมายinstall-fileในตัวคุณpom.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>

ตรวจสอบให้แน่ใจว่าได้แก้ไขfileพา ธ ตามไฟล์พา ธ จริงของคุณ (แนะนำคือการวางไหภายนอกที่ไม่ใช่ maven เหล่านี้ไว้ในบางโฟลเดอร์สมมติlibและวางlibโฟลเดอร์นี้ไว้ในโครงการของคุณเพื่อที่จะใช้พา ธ สัมพัทธ์เฉพาะโครงการและหลีกเลี่ยงการเพิ่มระบบ เส้นทางสัมบูรณ์ที่เฉพาะเจาะจง

หากคุณมีขวดภายนอกหลายขวดให้ทำซ้ำ<execution>สำหรับขวดอื่นภายในเดียวกันmaven-install-pluginภายในเดียวกัน

ขั้นตอนที่ 2:เมื่อคุณกำหนดค่าmaven-install-pluginตามที่แสดงด้านบนในpom.xmlไฟล์ของคุณคุณต้องใช้ไหเหล่านี้ในของคุณpom.xmlตามปกติ:

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

สังเกตว่า maven-install-pluginเพียงสำเนาขวดภายนอกของคุณไปยังท้องถิ่น.m2เก็บ mavenแค่นั้นแหละ. ไม่รวมไหเหล่านี้โดยอัตโนมัติในฐานะการอ้างอิง Maven กับโครงการของคุณ

มันเป็นประเด็นย่อย แต่บางครั้งก็พลาดง่าย


0

ฉันมีข้อผิดพลาดเดียวกันสำหรับชุดการพึ่งพาใน pom.xml ของฉันปรากฎว่าเวอร์ชันของการพึ่งพาไม่ได้ระบุไว้ใน pom.xml และถูกกล่าวถึงในที่เก็บพาเรนต์ ด้วยเหตุผลบางอย่างรายละเอียดเวอร์ชันไม่ได้ซิงค์กับ repo นี้ ดังนั้นฉันป้อนเวอร์ชันด้วยตนเองโดยใช้แท็กและทำงานได้เหมือนเครื่องราง ใช้เวลาเล็กน้อยในการค้นหาเวอร์ชันในพาเรนต์และระบุที่นี่ แต่สิ่งนี้สามารถทำได้สำหรับไหที่แสดงข้อผิดพลาดของวัตถุและใช้งานได้ หวังว่านี่จะช่วยใครซักคน


0

ใน Apache Maven 3.5.4 ฉันต้องเพิ่มเครื่องหมายคำพูดคู่ มันก็ไม่ได้ผลสำหรับฉัน

ตัวอย่าง: mvn ติดตั้ง: install-file "-Dfile = ตำแหน่งไปยังไฟล์ jar" "-DgroupId = group id" "-DartifactId = artifact id" "-Dversion = version" "-Dpackaging = ประเภทแพ็คเกจ"


0
  1. สร้างไดเรกทอรีที่เก็บ Maven ในเครื่องรูทโปรเจคของคุณควรมีลักษณะเช่นนี้เริ่มต้นด้วย:
yourproject
+- pom.xml
+- src
  1. เพิ่มไดเร็กทอรีที่เก็บ Maven มาตรฐานชื่อ repo สำหรับกลุ่ม com.example และเวอร์ชัน 1.0:
yourproject
+- pom.xml
+- src
+- repo
  1. ปรับใช้ Artifact Into the Repo Maven สามารถปรับใช้สิ่งประดิษฐ์สำหรับคุณโดยใช้การปรับใช้ mvn: deploy-file target:
mvn deploy:deploy-file -Durl=file:///pathtoyour/repo -Dfile=your.jar -DgroupId=your.group.id -DartifactId=yourid -Dpackaging=jar -Dversion=1.0
  1. ติดตั้งไฟล์ pom ที่สอดคล้องกับ jar ของคุณเพื่อให้โครงการของคุณสามารถค้นหา jar ระหว่าง maven build จาก repo ในเครื่อง:
mvn install:install-file -Dfile=/path-to-your-jar-1.0.jar -DpomFile=/path-to-your-pom-1.0.pom
  1. เพิ่ม repo ในไฟล์ pom ของคุณ:
<repositories>
    <!--other repositories if any-->
    <repository>
        <id>project.local</id>
        <name>project</name>
        <url>file:${project.basedir}/repo</url>
    </repository>
</repositories>
  1. เพิ่มการพึ่งพาใน pom ของคุณ:
<dependency>
    <groupId>com.groupid</groupId>
    <artifactId>myid</artifactId>
    <version>1.0</version>
</dependency>

-2

คำตอบนี้มีไว้สำหรับผู้ใช้ ECLIPSE เท่านั้น:

หากคุณกำลังใช้ Eclipse วาง jar ใน lib / คลิกขวาที่ชื่อ jar และคลิก "add to build path" Eclipse จะสร้าง "ห้องสมุดอ้างอิง" และวางโถสำหรับคุณ

มันแก้ปัญหาการนำเข้า jar ทันทีในโปรแกรมสำหรับฉัน


5
นั่นจะเพิ่มการเข้าสู่ Eclipse .classpathแต่งานสร้าง maven ของคุณmvn packageจะคร่าวๆเมื่อคุณเริ่มใช้การอ้างอิงนั้นเนื่องจาก maven ไม่มีคำจำกัดความและควรมีเฉพาะในpom.xml
Paul Verest

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