คุณจัดการกับสแน็ปช็อตที่ประทับเวลา maven-3 อย่างมีประสิทธิภาพได้อย่างไร?


87

ตอนนี้ maven-3 ได้ยกเลิกการสนับสนุน <uniqueVersion> false </uniqueVersion> สำหรับสิ่งประดิษฐ์สแนปชอตดูเหมือนว่าคุณจำเป็นต้องใช้ SNAPSHOTS ที่ประทับเวลาจริงๆ โดยเฉพาะอย่างยิ่ง m2eclipse ซึ่งใช้ maven 3 ภายในดูเหมือนว่าจะได้รับผลกระทบการอัปเดตสแนปชอตไม่ทำงานเมื่อ SNAPSHOTS ไม่ซ้ำกัน

ดูเหมือนแนวทางปฏิบัติที่ดีที่สุดก่อนที่จะตั้งค่าสแนปชอตทั้งหมดเป็น uniqueVersion = false

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

ปัญหาคือเวิร์กสเตชันของนักพัฒนาท้องถิ่น พื้นที่เก็บข้อมูลในท้องถิ่นของตนได้อย่างรวดเร็วไม่เติบโตมากขนาดใหญ่ที่มีภาพรวมที่ไม่ซ้ำกัน

จะจัดการกับปัญหานี้อย่างไร?

ตอนนี้ฉันเห็นวิธีแก้ไขที่เป็นไปได้ต่อไปนี้:

  • ขอให้นักพัฒนาล้างที่เก็บข้อมูลเป็นระยะ ๆ (ซึ่งนำไปสู่ความยุ่งยากมากมายเนื่องจากต้องใช้เวลานานในการลบและดาวน์โหลดทุกอย่างที่จำเป็นนานขึ้น)
  • ตั้งค่าสคริปต์บางส่วนซึ่งจะลบไดเร็กทอรีSNAPSHOTทั้งหมดออกจากที่เก็บในเครื่องและขอให้นักพัฒนาเรียกใช้สคริปต์นั้นเป็นครั้งคราว (ดีกว่าครั้งแรก แต่ก็ยังใช้เวลาพอสมควรในการเรียกใช้และดาวน์โหลดสแนปชอตปัจจุบัน)
  • ใช้การอ้างอิง: ปลั๊กอิน purge-local-repository (มีปัญหาเมื่อเรียกใช้จาก eclipse เนื่องจากไฟล์ที่เปิดอยู่จำเป็นต้องเรียกใช้จากแต่ละโครงการ)
  • ตั้งค่าเน็กซัสในทุกเวิร์กสเตชันและตั้งค่างานเพื่อล้างสแน็ปช็อตเก่า (ผลลัพธ์ที่ดีที่สุด แต่ฉันไม่ต้องการดูแลเซิร์ฟเวอร์ nexus มากกว่า 50+ เซิร์ฟเวอร์รวมทั้งหน่วยความจำในเวิร์กสเตชันของนักพัฒนาซอฟต์แวร์จะแน่น)
  • หยุดใช้ SNAPSHOTS เลย

อะไรคือวิธีที่ดีที่สุดในการป้องกันไม่ให้ที่เก็บข้อมูลในเครื่องของคุณเต็มพื้นที่ฮาร์ดไดรฟ์ของคุณ

อัปเดต:

ในการตรวจสอบความถูกต้องและเพื่อให้ข้อมูลเพิ่มเติมฉันตั้งค่าเซิร์ฟเวอร์ Nexus ขนาดเล็กสร้างสองโปรเจ็กต์ (a และ b) แล้วลอง:

ก:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>de.glauche</groupId>
  <artifactId>a</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <distributionManagement>
    <snapshotRepository>
        <id>nexus</id>
        <name>nexus</name>
        <url>http://server:8081/nexus/content/repositories/snapshots</url>
    </snapshotRepository>
  </distributionManagement>

</project>

ข:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>de.glauche</groupId>
  <artifactId>b</artifactId>
  <version>0.0.1-SNAPSHOT</version>
    <distributionManagement>
    <snapshotRepository>
        <id>nexus</id>
        <name>nexus</name>
        <url>http://server:8081/nexus/content/repositories/snapshots/</url>
    </snapshotRepository>
  </distributionManagement>
 <repositories>
    <repository>
        <id>nexus</id>
        <name>nexus</name>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
        <url>http://server:8081/nexus/content/repositories/snapshots/</url>
    </repository>
 </repositories>
  <dependencies>
    <dependency>
        <groupId>de.glauche</groupId>
        <artifactId>a</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
  </dependencies>
</project>

ตอนนี้เมื่อฉันใช้ maven และรัน "deploy" บน "a" ฉันจะมี

a-0.0.1-SNAPSHOT.jar
a-0.0.1-20101204.150527-6.jar
a-0.0.1-SNAPSHOT.pom
a-0.0.1-20101204.150527-6.pom

ในที่เก็บในเครื่อง ด้วยเวอร์ชันประทับเวลาใหม่ทุกครั้งที่ฉันรันเป้าหมายการปรับใช้ สิ่งเดียวกันนี้เกิดขึ้นเมื่อฉันพยายามอัปเดต Snapshots จากเซิร์ฟเวอร์ nexus (ปิด "a" Project ลบออกจากที่เก็บในเครื่องสร้าง "b")

ในสภาพแวดล้อมที่มีการสร้างสแนปชอตจำนวนมาก (คิดว่าเซิร์ฟเวอร์ฮัดสัน ... ) reposioty ในเครื่องจะเต็มไปด้วยเวอร์ชันเก่าอย่างรวดเร็ว

อัปเดต 2:

เพื่อทดสอบว่าเหตุใดจึงล้มเหลวฉันได้ทำการทดสอบเพิ่มเติม การทดสอบแต่ละครั้งจะดำเนินการกับทุกสิ่งที่สะอาด (de / glauche ถูกลบจากทั้งสองเครื่องและ nexus)

  • mvn ปรับใช้กับ maven 2.2.1:

ที่เก็บในเครื่องบนเครื่อง A มี snapshot.jar + snapshot-timestamp.jar

แต่: มีเพียง jar ที่ประทับเวลาเดียวใน nexus ข้อมูลเมตาจะอ่าน:

<?xml version="1.0" encoding="UTF-8"?>
<metadata>
  <groupId>de.glauche</groupId>
  <artifactId>a</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <versioning>
    <snapshot>
      <timestamp>20101206.200039</timestamp>

      <buildNumber>1</buildNumber>
    </snapshot>
    <lastUpdated>20101206200039</lastUpdated>
  </versioning>
</metadata>
  • รันการอ้างอิงการอัปเดต (บนเครื่อง B) ใน m2eclipse (ฝัง m3 ขั้นสุดท้าย) -> ที่เก็บในเครื่องมี snapshot.jar + snapshot-timestamp.jar :(
  • เรียกใช้เป้าหมายแพ็คเกจด้วย maven ภายนอก 2.2.1 -> ที่เก็บในเครื่องมี snapshot.jar + snapshot-timestamp.jar :(

ตกลงลองใช้ maven 3.0.1 ต่อไป (หลังจากลบร่องรอยทั้งหมดของโครงการ a)

  • ที่เก็บในเครื่องบนเครื่อง A ดูดีกว่าโถที่ไม่ประทับเวลาเพียงอันเดียว

  • jar ที่ประทับเวลาเพียงอันเดียวใน nexus ข้อมูลเมตาจะอ่าน:

    de.glauche a 0.0.1-SNAPSHOT

    <snapshot>
      <timestamp>20101206.201808</timestamp>
      <buildNumber>3</buildNumber>
    </snapshot>
    <lastUpdated>20101206201808</lastUpdated>
    <snapshotVersions>
      <snapshotVersion>
        <extension>jar</extension>
        <value>0.0.1-20101206.201808-3</value>
        <updated>20101206201808</updated>
      </snapshotVersion>
      <snapshotVersion>
        <extension>pom</extension>
        <value>0.0.1-20101206.201808-3</value>
        <updated>20101206201808</updated>
      </snapshotVersion>
    </snapshotVersions>
    

  • รันการอ้างอิงการอัปเดต (บนเครื่อง B) ใน m2eclipse (ฝัง m3 ขั้นสุดท้าย) -> ที่เก็บในเครื่องมี snapshot.jar + snapshot-timestamp.jar :(

  • เรียกใช้เป้าหมายแพ็คเกจด้วย maven ภายนอก 2.2.1 -> ที่เก็บในเครื่องมี snapshot.jar + snapshot-timestamp.jar :(

ดังนั้นเพื่อสรุป: เป้าหมาย "ปรับใช้" ใน maven3 ทำงานได้ดีกว่าใน 2.2.1 ที่เก็บในเครื่องบนเครื่องสร้างดูดี แต่ผู้รับมักจะลงเอยด้วยเวอร์ชันที่มีเวลามากมาย ...

ผมทำอะไรผิดหรือเปล่า ?

อัปเดต 3

ฉันยังทดสอบการกำหนดค่าอื่น ๆ อีกมากมายก่อนอื่นให้แทนที่ nexus ด้วย artifactory -> พฤติกรรมเดียวกัน จากนั้นใช้ไคลเอนต์ linux maven 3 เพื่อดาวน์โหลดสแน็ปช็อตจากตัวจัดการที่เก็บ -> ที่เก็บในเครื่องยังคงมีสแน็ปช็อตที่ประทับเวลา :(


คำถามที่เกี่ยวข้องเกี่ยวกับเพียง .m2 ท้องถิ่น \ ส่วนพื้นที่เก็บข้อมูลที่มุ่งเน้นการเก็บข้อมูลในท้องถิ่นบน (เจนกินส์) สร้างเซิร์ฟเวอร์: stackoverflow.com/q/9729076/223837
MarnixKlooster ReinstateMonica

นี่คือลิงค์ที่ใช้งานได้ไปยัง Apcahe Maven Comptability Notes - cwiki.apache.org/confluence/display/MAVEN/…
aka_sh

คำตอบ:


36

การ<uniqueVersion>กำหนดค่าใช้กับอาร์ติแฟกต์ที่ทำให้ใช้งานได้ (ผ่านการปรับใช้ mvn) กับที่เก็บ Maven เช่น Nexus

หากต้องการลบสิ่งเหล่านี้ออกจาก Nexus คุณสามารถสร้างงานอัตโนมัติเพื่อล้างที่เก็บ SNAPSHOT ได้ทุกวัน สามารถกำหนดค่าให้เก็บ shapshots จำนวนหนึ่งหรือเก็บไว้ในช่วงเวลาหนึ่ง มันง่ายมากและใช้งานได้ดี

อาร์ติแฟกต์ในพื้นที่เก็บข้อมูลในเครื่องบนเครื่องของนักพัฒนาไปที่นั่นจากเป้าหมาย "ติดตั้ง" และไม่ใช้การประทับเวลาเหล่านี้ ... พวกมันเพียงแค่แทนที่เวอร์ชัน SNAPSHOT เวอร์ชันเดียวเท่านั้นเว้นแต่คุณจะเพิ่มหมายเลขการแก้ไขด้วย (เช่น 1.0.0- SNAPSHOT เป็น 1.0.1-SNAPSHOT)


1
ปัญหาคือเป้าหมาย "ติดตั้ง" ไม่ได้ถูกนำมาใช้มากนักในสภาพแวดล้อมแบบกระจายกับนักพัฒนาจำนวนมาก นอกจากนี้เรายังใช้เซิร์ฟเวอร์ฮัดสันที่สร้าง (และปรับใช้) สแน็ปช็อตใหม่ในทุกการคอมมิต cvs ซึ่งเกิดขึ้นค่อนข้างบ่อยในแต่ละวัน ฉันรู้เกี่ยวกับ nexus snapshot ลบ mechainsm ดูรายการวิธีแก้ปัญหาที่เป็นไปได้
mglauche

เครื่องพัฒนาแต่ละเครื่องควรมีที่เก็บ "โลคัล" อยู่ข้างใต้~/.m2/repositoryและแต่ละเครื่องpom.xmlควรมีคำจำกัดความของพื้นที่เก็บข้อมูลที่ชี้ไปยังอินสแตนซ์เดียวของ Nexus บน LAN ของคุณ (เช่นเดียวกับที่คุณแสดง) เรามีการตั้งค่านี้พร้อมกับฮัดสันที่สร้างขึ้นจากการโค่นล้มทุกครั้งและทำงานได้ดี บิวด์ SNAPSHOT เป็นแบบ "ใช้งาน" กับ Nexus ซึ่งจะรวบรวมและล้างข้อมูลทุกสัปดาห์ เครื่องของนักพัฒนาจะดาวน์โหลด SNAPSHOT ล่าสุดจาก Nexus ไปโดยอัตโนมัติ ~/.m2/repositoryและจะแทนที่เครื่องที่ดาวน์โหลดก่อนหน้านี้ นักพัฒนาไม่ควรมีอินสแตนซ์ Nexus ของตนเอง
HDave

2
ฉันเพิ่งอ่านการอัปเดตของคุณและมีอีกสิ่งหนึ่งที่จะเพิ่ม: สิ่งประดิษฐ์ที่ประทับเวลาไม่ควรปรากฏในที่เก็บ (~ / .m2 / ที่เก็บ) ในเครื่องของคุณ หากเป็นเช่นนั้นมีบางอย่างผิดปกติ ควรมองเห็นได้ภายใน Nexus เท่านั้น ภายใน Nexus ใช่มันเก็บรวบรวมได้อย่างรวดเร็ว หลายร้อย MB ต่อวัน งาน nexus สามารถล้างสิ่งเหล่านี้ได้ง่ายขึ้นทุกวันเพื่อให้ปริมาณน้อย
HDave

6
แน่นอนพวกเขาจบลงในที่เก็บในเครื่อง (ที่เก็บ ~ / .m2 / ที่เก็บ) พวกเขาจบลงที่นั่นหลังจากรันเป้าหมาย "ปรับใช้" และบน mvn -U ติดตั้งบนโปรเจ็กต์ที่ขึ้นอยู่ ฉันได้ทดสอบด้วย maven 2.2.1 และ maven 3 ทั้งคู่มีพฤติกรรมเหมือนกัน
mglauche

2
ฉันคิดว่าฉันเข้าใจแล้ว ... พวกเขาจะไม่ปรากฏที่นั่นเมื่อการพัฒนาทำการ "ปรับใช้" แต่เมื่อนักพัฒนาสร้างโครงการที่ต้องพึ่งพา ในเวลานั้น SNAPSHOT ล่าสุดของโปรเจ็กต์ต้นน้ำจะถูกดาวน์โหลดจาก Nexus ไปยัง ~ / .m2 / ที่เก็บโดยมีการประทับเวลาทิ้งไว้เหมือนเดิมเป็นส่วนหนึ่งของชื่อไฟล์ นี่ใช่มั้ย?
HDave

14

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

<plugin>         
    <groupId>org.codehaus.mojo</groupId>         
    <artifactId>build-helper-maven-plugin</artifactId>         
    <version>1.7</version>         
    <executions>           
        <execution>             
            <id>remove-old-artifacts</id>             
            <phase>package</phase>             
            <goals>               
                <goal>remove-project-artifact</goal>             
            </goals>            
            <configuration>  
                <removeAll>true</removeAll><!-- When true, remove all built artifacts including all versions. When false, remove all built artifacts of this project version -->             
            </configuration>          
        </execution>         
    </executions>       
</plugin>

7

ฉันไม่ชอบโซลูชันที่เสนอ การลบ maven cache มักจะเพิ่มปริมาณการใช้งานเครือข่ายและทำให้กระบวนการสร้างช้าลง build-helper-maven-plugin ช่วยในสิ่งประดิษฐ์เดียวเท่านั้นฉันต้องการโซลูชันที่สามารถล้างสิ่งประดิษฐ์สแน็ปช็อตที่ประทับเวลาที่ล้าสมัยทั้งหมดออกจากแคชในเครื่องด้วยคำสั่งง่ายๆเพียงคำสั่งเดียว หลังจากค้นหาไม่กี่วันฉันก็ล้มเลิกและตัดสินใจเขียนโปรแกรมเล็ก ๆ โปรแกรมสุดท้ายดูเหมือนจะทำงานได้ดีในสภาพแวดล้อมของเรา ดังนั้นฉันจึงตัดสินใจแบ่งปันกับผู้อื่นที่อาจต้องการเครื่องมือดังกล่าว สามารถดึงแหล่งที่มาจาก github: https://github.com/nadestin/tools/tree/master/MavenCacheCleanup


@HDave ฉันไม่ได้จัดการอย่างถูกต้องส่วนรูปแบบ pom ที่นี่ตรวจสอบที่https://github.com/nadestin/tools/wiki/m2cachecleanup-maven-plugin บน Jenkins ของเราทาสยูทิลิตี้นี้เรียกคืนพื้นที่ดิสก์ ~ 200Mb ทุกวัน
yurinadestin

2

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

เรายังไม่ได้เริ่มใช้ Maven3 ดังนั้นเราจึงยังไม่เห็น SNAPSHOT ที่เริ่มสร้างขึ้นในเครื่องท้องถิ่น

แต่เรามีปัญหาที่แตกต่างกันกับ m2eclipse เมื่อเราเปิดใช้งาน "ความละเอียดของพื้นที่ทำงาน" และมีโครงการอยู่ในพื้นที่ทำงานของเราการอัปเดตแหล่งที่มามักจะทำให้เราไม่พลาด แต่เราพบว่ามันยากมากที่จะได้รับ m2eclipse เพื่ออัปเดตตัวเองด้วยสิ่งประดิษฐ์ที่เพิ่งเผยแพร่ใน Nexus เรากำลังประสบปัญหาที่คล้ายกันในทีมของเราและเป็นปัญหาอย่างยิ่งเนื่องจากเรามีกราฟโครงการขนาดใหญ่มาก ... มีการอ้างอิงจำนวนมากที่จะไม่อยู่ในพื้นที่ทำงานของคุณ แต่จะได้รับ SNAPSHOTs เผยแพร่บ่อยครั้ง

ฉันค่อนข้างมั่นใจว่าปัญหานี้กลับมาเป็นปัญหาใน m2eclipse ซึ่งมันไม่ได้จัดการ SNAPSHOT ให้ตรงตามที่ควร คุณสามารถดูในคอนโซล Maven ภายใน eclipse โดยที่ m2eclipse จะบอกคุณว่ากำลังข้ามการอัปเดตของ SNAPSHOT ที่เพิ่งเผยแพร่เนื่องจากมีเวอร์ชันแคช หากคุณทำ a -U จากการกำหนดค่าการรันหรือจากบรรทัดคำสั่งMavenจะรับการเปลี่ยนแปลงข้อมูลเมตา แต่การเลือก "อัปเดตสแนปชอต ... " ควรแจ้งให้ m2eclipse ให้ Maven หมดอายุแคชนี้ ดูเหมือนจะไม่ได้รับการส่งต่อ ดูเหมือนว่าจะมีข้อผิดพลาดเกิดขึ้นหากคุณสนใจที่จะลงคะแนนให้: https://issues.sonatype.org/browse/MNGECLIPSE-2608

คุณพูดถึงเรื่องนี้ในความคิดเห็นที่ไหนสักแห่ง

วิธีแก้ปัญหาที่ดีที่สุดสำหรับปัญหานี้ดูเหมือนว่านักพัฒนาซอฟต์แวร์จะล้างเวิร์กสเตชันในพื้นที่ของตนเมื่อสิ่งต่างๆเริ่มพังทลายจากภายใน m2eclipse วิธีแก้ปัญหาที่คล้ายกันสำหรับปัญหาอื่น ... คนอื่น ๆ รายงานปัญหาเกี่ยวกับ Maven 2.2.1 และ 3 สำรอง m2eclipse และฉันเคยเห็นเหมือนกัน

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

นั่นคือเว้นแต่ว่าคุณกำลังพูดถึงบิลด์เซิร์ฟเวอร์ที่ทำไฟล์ mvn installกับพวกเขา สำหรับวิธีการป้องกันไม่ให้ SNAPSHOTs สร้างขึ้นในสภาพแวดล้อมเช่นเซิร์ฟเวอร์บิลด์เราได้หลีกเลี่ยงสัญลักษณ์แสดงหัวข้อย่อยนั้นโดยให้แต่ละบิลด์ใช้พื้นที่ทำงานและพื้นที่เก็บข้อมูลภายในของตัวเอง (แม้ว่าใน Maven 2.2.1 จะมีบางอย่างเช่น POM ดูเหมือนจะออกมาจาก ~ / .m2 / repository เสมอ) SNAPSHOTs พิเศษจะติดอยู่กับบิลด์เดียวเท่านั้นจากนั้นก็จะถูกทิ้ง (และดาวน์โหลดอีกครั้งตั้งแต่เริ่มต้น) ดังนั้นเราจึงเห็นว่าวิธีนี้จะกินพื้นที่มากขึ้นในการเริ่มต้น แต่ก็มีแนวโน้มที่จะยังคงมีเสถียรภาพมากกว่าการแก้ไขทุกอย่างจากที่เก็บเดียว ตัวเลือกนี้ (บน Hudson) เรียกว่า "Use private Maven repository" และอยู่ภายใต้ปุ่ม Advanced ของส่วน Build ในการกำหนดค่าโปรเจ็กต์เมื่อคุณเลือกสร้างด้วย Maven คำอธิบายวิธีใช้สำหรับตัวเลือกนั้นมีดังนี้:

โดยปกติฮัดสันใช้ที่เก็บ Maven ในเครื่องตามที่ Maven กำหนด - กระบวนการที่แน่นอนดูเหมือนจะไม่มีเอกสาร แต่เป็น ~ / .m2 / ที่เก็บและสามารถแทนที่ได้โดยใน ~ / .m2 / settings.xml (ดูข้อมูลอ้างอิงสำหรับรายละเอียดเพิ่มเติม .) ซึ่งโดยปกติหมายความว่างานทั้งหมดที่ดำเนินการบนโหนดเดียวกันจะแชร์ที่เก็บ Maven เดียว ในทางกลับกันคือคุณสามารถประหยัดเนื้อที่ดิสก์ได้ แต่ข้อเสียของสิ่งนี้คือบางครั้งการสร้างเหล่านั้นอาจรบกวนซึ่งกันและกัน ตัวอย่างเช่นคุณอาจประสบความสำเร็จในการสร้างอย่างไม่ถูกต้องเพียงเพราะคุณมีการอ้างอิงทั้งหมดในที่เก็บในเครื่องของคุณแม้ว่าจะไม่มีที่เก็บใดใน POM ก็ตาม

นอกจากนี้ยังมีปัญหาที่ได้รับรายงานเกี่ยวกับการมีกระบวนการ Maven พร้อมกันที่พยายามใช้ที่เก็บในเครื่องเดียวกัน

เมื่อเลือกตัวเลือกนี้ฮัดสันจะบอกให้ Maven ใช้ $ WORKSPACE / .repository เป็นที่เก็บ Maven ในเครื่อง ซึ่งหมายความว่าแต่ละงานจะได้รับพื้นที่เก็บข้อมูล Maven ที่แยกไว้สำหรับตัวมันเอง แก้ไขปัญหาข้างต้นโดยเสียค่าใช้จ่ายในการใช้พื้นที่ดิสก์เพิ่มเติม

เมื่อใช้ตัวเลือกนี้ให้ลองตั้งค่าตัวจัดการสิ่งประดิษฐ์ Maven เพื่อที่คุณจะได้ไม่ต้องกดที่เก็บ Maven ระยะไกลบ่อยเกินไป

หากคุณต้องการเปิดใช้งานโหมดนี้ในงาน Maven ทั้งหมดที่ดำเนินการบน Hudson โปรดดูเทคนิคที่อธิบายไว้ที่นี่

หวังว่านี่จะช่วยได้ - หากไม่สามารถแก้ปัญหาของคุณได้โปรดแจ้งให้เราทราบว่าพลาดตรงไหน


ข้อบกพร่องดังกล่าวข้างต้นได้รับการแก้ไขแล้ว: bugs.eclipse.org/bugs/show_bug.cgi?id=339527
HDave

1

อย่างรวดเร็วการลบไฟล์ที่ประทับเวลาartifact-0.0.1-20101204.150527-6.jarอาจทำได้ง่ายมาก:

root = 'path to your repository'

new File(root).eachFileRecurse {
  if (it.name.matches(/.*\-\d{8}\.\d{6}\-\d+\.[\w\.]+$/)) {
    println 'Deleting ' + it.name
    it.delete()
  }
}

ติดตั้งGroovyบันทึกสคริปต์ลงในไฟล์และกำหนดเวลาการดำเนินการในแต่ละสัปดาห์เริ่มต้นเข้าสู่ระบบสิ่งที่เหมาะกับคุณ

หรือคุณยังสามารถดำเนินการลวดลง Maven สร้างโดยใช้gmavenplus ปลั๊กอิน สังเกตว่าตำแหน่งที่เก็บถูกกำหนดโดย maven ในคุณสมบัติอย่างไรsettings.localRepositoryจากนั้นผูกผ่านการกำหนดค่าเป็นตัวแปรrepository:

  <plugin>
    <groupId>org.codehaus.gmavenplus</groupId>
    <artifactId>gmavenplus-plugin</artifactId>
    <version>1.3</version>
    <executions>
      <execution>
        <phase>install</phase>
        <goals>
          <goal>execute</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <properties>
        <property>
          <name>repository</name>
          <value>${settings.localRepository}</value>
        </property>
      </properties>
      <scripts>
        <script><![CDATA[
          new File(repository).eachFileRecurse {
            if (it.name.matches(/.*\-\d{8}\.\d{6}\-\d+\.[\w\.]+$/)) {
              println 'Deleting snapshot ' + it.getAbsolutePath()
              it.delete()
            }
          }
        ]]></script>
      </scripts>
    </configuration>
    <dependencies>
      <dependency>
        <groupId>org.codehaus.groovy</groupId>
        <artifactId>groovy-all</artifactId>
        <version>2.3.7</version>
        <scope>runtime</scope>
      </dependency>
    </dependencies>
  </plugin>  

0

เพิ่มพารามิเตอร์ต่อไปนี้ลงในไฟล์ POM ของคุณ

ปอม

<configuration>
<outputAbsoluteArtifactFilename>true</outputAbsoluteArtifactFilename>
</configuration>

https://maven.apache.org/plugins/maven-dependency-plugin/copy-mojo.html

ตัวอย่าง POM

<plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>2.10</version>
        <executions>
          <execution>
            <id>copy</id>
            <phase>package</phase>
            <goals>
              <goal>copy</goal>
            </goals>
            <configuration>
              <artifactItems>
                <artifactItem>
                  <groupId>junit</groupId>
                  <artifactId>junit</artifactId>
                  <version>3.8.1</version>
                  <type>jar</type>
                  <overWrite>false</overWrite>
                  <outputDirectory>${project.build.directory}/alternateLocation</outputDirectory>
                  <destFileName>optional-new-name.jar</destFileName>
                </artifactItem>
              </artifactItems>
              **<outputAbsoluteArtifactFilename>true</outputAbsoluteArtifactFilename>**
              <outputDirectory>${project.build.directory}/wars</outputDirectory>
              <overWriteReleases>false</overWriteReleases>
              <overWriteSnapshots>true</overWriteSnapshots>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

กำหนดค่าใน Jenkins:

// copy artifact 
copyMavenArtifact(artifact: "commons-collections:commons-collections:3.2.2:jar", outputAbsoluteArtifactFilename: "${pwd()}/target/my-folder/commons-collections.jar")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.