Maven: จะรวมไหซึ่งไม่มีในตัวแทนเข้าในโครงการ J2EE ได้อย่างไร


100

ในโครงการ J2EE ของฉันฉันมีการอ้างอิงสองสามรายการซึ่งไม่มีอยู่ในที่เก็บ Maven ใด ๆ เนื่องจากเป็นไลบรารีที่เป็นกรรมสิทธิ์ ไลบรารีเหล่านี้จำเป็นต้องพร้อมใช้งานที่รันไทม์ดังนั้นจึงต้องคัดลอกไปยังเป้าหมาย /.../ WEB-INF / lib ...

ตอนนี้ฉันแสดงรายการเป็นการพึ่งพาระบบใน POM ของฉัน แต่ด้วยวิธีนี้ปัญหาคือจะไม่ถูกคัดลอกไปยังบิลด์เป้าหมายระหว่างการคอมไพล์ นอกจากนี้วิธีนี้ยังไม่สง่างามมาก

วิธีใดที่ดีที่สุดในการรวมเข้ากับ Maven

หมายเหตุ: ฉันไม่ต้องการสร้างที่เก็บ Maven ของตัวเอง


7
ฉันจริงๆคิดว่าคุณควรทบทวนการตัดสินใจของการสร้างพื้นที่เก็บข้อมูล Maven ไม่ยากเลยและคุ้ม 100%
Robert Munteanu

7
มูลค่าของการสร้างที่เก็บ Maven ขึ้นอยู่กับสถานการณ์
yincrash

คำตอบ:


54

อย่างที่คุณบอกว่าคุณไม่ต้องการตั้งค่าที่เก็บของคุณเองบางทีนี่อาจช่วยได้

คุณสามารถใช้เป้าหมายการติดตั้งไฟล์ของ maven-install-plugin เพื่อติดตั้งไฟล์ไปยังที่เก็บในเครื่อง หากคุณสร้างสคริปต์ด้วยการเรียกใช้ Maven สำหรับแต่ละไฟล์และเก็บไว้ข้างไหคุณ (และคนอื่น ๆ ที่มีสิทธิ์เข้าถึง) สามารถติดตั้ง jars (และไฟล์ pom ที่เกี่ยวข้อง) ไปยังที่เก็บในเครื่องได้อย่างง่ายดาย

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

mvn install:install-file -Dfile=/usr/jars/foo.jar -DpomFile=/usr/jars/foo.pom
mvn install:install-file -Dfile=/usr/jars/bar.jar -DpomFile=/usr/jars/bar.pom

หรือเพียงแค่

mvn install:install-file -Dfile=ojdbc14.jar -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0 -Dpackaging=jar

จากนั้นคุณสามารถอ้างอิงการอ้างอิงตามปกติในโครงการของคุณ

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


1
ขอบคุณวิธีนี้ใช้ได้ดีสำหรับฉันตอนนี้ ฉันขยาย POM เพื่อให้ไฟล์ถูกติดตั้งโดยอัตโนมัติไปยังตัวแทนในเครื่อง: pastebin.ca/1504318
samson

ดีใจที่ได้ช่วยเหลือ แต่อย่างที่คนอื่นบอกวิธีที่ดีที่สุดคือการใช้ตัวจัดการพื้นที่เก็บข้อมูล Maven แนวทางนี้ไม่สามารถปรับขนาดได้ดี
Rich Seller

4
คำสั่งที่ใช้ได้กับฉัน: "mvn install: install-file -Dfile = cassandra-jdbc-1.1.1.jar -DgroupId = org.apache-extras.cassandra-jdbc -DartifactId = cassandra-jdbc -Dversion = 1.1.1 -Dpackaging = jar "
Mazrick

193

สำหรับผู้ที่ต้องการวิธีแก้ไขปัญหานี้อย่างรวดเร็ว:

<dependency>
  <groupId>LIB_NAME</groupId>
  <artifactId>LIB_NAME</artifactId>
  <version>1.0.0</version>
  <scope>system</scope>
  <systemPath>${basedir}/WebContent/WEB-INF/lib/YOUR_LIB.jar</systemPath>
</dependency>

เพียงตั้งชื่อ groupID และชื่ออาร์ติแฟกต์เฉพาะไลบรารีของคุณแล้วชี้ไปที่ตำแหน่งนั้นในระบบไฟล์ คุณพร้อมที่จะไป

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

แก้ไข: เพียงแค่ถามคำถามอีกครั้งและตระหนักว่าผู้ใช้กำลังใช้โซลูชันของฉันเป็นการแก้ไขชั่วคราว ฉันจะปล่อยให้คำตอบของฉันเป็นความช่วยเหลืออย่างรวดเร็วสำหรับคนอื่น ๆ ที่มีคำถามนี้ หากใครไม่เห็นด้วยกับสิ่งนี้โปรดแสดงความคิดเห็น :)


4
เย็น. มีวิธีระบุ URL แทนเส้นทางเครื่องภายในหรือไม่
phreakhead

3
ขอบคุณสำหรับตัวอย่างที่สมบูรณ์และใช้งานได้ !!! ฉันหวังว่าคุณจะจับปลาทองได้และมันก็ให้ความปรารถนาสามประการ :)
johndodo

14
นี่ควรเป็นคำตอบที่ยอมรับได้เนื่องจากมีอยู่ในตัว (ใน pom.xml)
Vikram

2
สวัสดี Rajarshee รหัสกลุ่มและสิ่งประดิษฐ์เป็นไปโดยพลการ เส้นทางไปยัง jar ของคุณในระบบไฟล์เป็นสิ่งสำคัญสำหรับการทำงานนี้ เพราะในความเป็นจริงโถไม่ใช่ที่พึ่งพาของสัตว์คุณเพียง แต่บอกให้ Maven ปฏิบัติต่อมันอย่างเดียว
Ric Jafe

1
ในปี 2559 สิ่งนี้ดูเหมือนจะไม่ได้ผล บิวด์รับทราบเส้นทาง แต่ไม่รวมรหัสในโถที่แรเงา หนู ...
markthegrea

24

สร้างโฟลเดอร์ที่เก็บภายใต้โครงการของคุณ เอาเถอะ

${project.basedir}/src/main/resources/repo

จากนั้นติดตั้ง jar ที่คุณกำหนดเองลงใน repo นี้:

mvn install:install-file -Dfile=[FILE_PATH] \
-DgroupId=[GROUP] -DartifactId=[ARTIFACT] -Dversion=[VERS] \ 
-Dpackaging=jar -DlocalRepositoryPath=[REPO_DIR]

สุดท้ายเพิ่มคำจำกัดความ repo และการอ้างอิงต่อไปนี้ในโปรเจ็กต์ pom.xml:

<repositories>
    <repository>
        <id>project-repo</id>
        <url>file://${project.basedir}/src/main/resources/repo</url>
    </repository>
</repositories>

<dependencies>    
    <dependency>
        <groupId>[GROUP]</groupId>
        <artifactId>[ARTIFACT]</artifactId>
        <version>[VERS]</version>
    </dependency>
</dependencies>

1
สิ่งนี้ได้ผลดีสำหรับฉัน ปล. ฉันอยากจะแนะนำไดเร็กทอรีอื่นสำหรับ repo ในพื้นที่เนื่องจากการวางไว้ใน "src" ดูเหมือนจะไม่ถูกต้อง (ไม่ใช่แหล่งที่มา!)
davidfrancis

1
มันทำงานได้อย่างมีเสน่ห์ ฉันกำลังย้ายโปรเจ็กต์เก่าจาก Ant ไปยัง Maven และมี libs ที่ฉันไม่พบในเว็บ repos
Paulo Pedroso

ข้อควรระวัง: เมื่อค่าสำหรับ -DlocalRepositoryPath ไม่ได้ลงท้ายด้วย/(เช่นระบุโฟลเดอร์) จากนั้น repo จะถูกสร้างด้วย groupId Ex: หากกลุ่ม ID เป็นfoo.comและ localRepositoryPath เป็นrepoแล้วโฟลเดอร์ repo repo.foo.comจะกลายเป็น
Sheshadri Mantha

โพรซีเดอร์นี้เป็นโปรเจ็กต์โลคัลเพื่อจัดการที่เก็บระบบโดยใช้ maven build automation tool ที่ใช้สำหรับโปรเจ็กต์ Java และระบบไฟล์เป็นหลัก
Oleksii Kyslytsyn

8

คุณต้องตั้งค่าที่เก็บในเครื่องที่จะโฮสต์ไลบรารีดังกล่าว มีหลายโครงการที่ทำเช่นนั้น ยกตัวอย่างเช่นArtifactory


4
ประเด็นเกี่ยวกับคำศัพท์คือที่เก็บระยะไกลภายในไม่ใช่ที่เก็บในเครื่อง ที่เก็บโลคัลเป็นที่เก็บบนการอ้างอิงระบบไฟล์โลคัลจะถูกดาวน์โหลดไปยัง
Rich Seller

3

ไม่มีวิธีแก้ปัญหาใด ๆ หากคุณใช้ Jenkins build !! เมื่อ pom ทำงานภายในเซิร์ฟเวอร์สร้าง Jenkins .. โซลูชันเหล่านี้จะล้มเหลวเนื่องจาก Jenkins เรียกใช้ pom จะพยายามดาวน์โหลดไฟล์เหล่านี้จากที่เก็บข้อมูลขององค์กร

คัดลอก jars ภายใต้ src / main / resources / lib (สร้างโฟลเดอร์ lib) สิ่งเหล่านี้จะเป็นส่วนหนึ่งของโครงการของคุณและไปยังเซิร์ฟเวอร์การปรับใช้ ในเซิร์ฟเวอร์การปรับใช้ตรวจสอบให้แน่ใจว่าสคริปต์เริ่มต้นของคุณมี src / main / resources / lib / * ใน classpath วิโอลา.


2

คุณสามารถติดตั้งในพื้นที่เก็บข้อมูลส่วนตัวในเครื่อง (เช่น. m2 / repository ภายใต้โฮมไดเร็กทอรีของคุณ): ดูรายละเอียดเพิ่มเติมที่นี่


7
ใช่ฉันทำได้ แต่ฉันต้องบอกทุกคนที่ต้องการสร้างโปรเจ็กต์ว่าเขาต้องใส่ไฟล์ X, Y ในไดเร็กทอรี Z และนั่นทำให้สิ่งต่าง ๆ ซับซ้อนมาก ท้ายที่สุดฉันต้องการใช้ Maven เพื่อลดความซับซ้อนของกระบวนการสร้าง
samson

2

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

หวังว่าจะเป็นประโยชน์ในกรณีของคุณ ( ตัวอย่าง )


2

โซลูชันของ @Ric Jafe คือสิ่งที่เหมาะกับฉัน

นี่คือสิ่งที่ฉันกำลังมองหา วิธีผลักดันรหัสทดสอบการวิจัย ไม่มีอะไรแฟนซี ใช่ฉันรู้ว่านั่นคือสิ่งที่พวกเขาพูด :) โซลูชันปลั๊กอิน maven ต่างๆดูเหมือนจะมากเกินไปสำหรับวัตถุประสงค์ของฉัน ฉันมีขวดโหลที่มอบให้ฉันเป็น libs บุคคลที่สามพร้อมไฟล์ pom ฉันต้องการให้คอมไพล์ / เรียกใช้อย่างรวดเร็ว วิธีแก้ปัญหานี้ซึ่งฉันปรับให้เข้ากับ python ได้อย่างมหัศจรรย์สำหรับฉัน ตัดและวางลงในปอมของฉัน รหัส Python / Perl สำหรับงานนี้อยู่ใน Q&A นี้: ฉันสามารถเพิ่ม jars ใน maven 2 build classpath โดยไม่ต้องติดตั้งได้หรือไม่

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

โซลูชันด้านบนส่งคืน 'dependencies.dependency.systemPath' สำหรับ xx.jar ไม่ควรชี้ไปที่ไฟล์ภายในไดเร็กทอรีโปรเจ็กต์ ดูstackoverflow.com/questions/10935135/…
sarah.ferguson


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