ยกเว้นการอ้างอิงสกรรมกริยาทั้งหมดของการขึ้นต่อกันครั้งเดียว


221

ใน Maven2 เพื่อยกเว้นการพึ่งพาสกรรมกริยาเดียวฉันต้องทำสิ่งนี้:

<dependency>
  <groupId>sample.group</groupId>
  <artifactId>sample-artifactB</artifactId>
  <version>1</version>
   <exclusions>
     <exclusion>
       <groupId>sample.group</groupId>
       <artifactId>sample-artifactAB</artifactId>
     </exclusion>
   </exclusions>
</dependency>

sample-artifactBปัญหาด้วยวิธีนี้คือว่าผมจะต้องทำเช่นนี้สำหรับทุกการพึ่งพาสกรรมกริยาสนับสนุนโดย

มีวิธีใช้ wildcard บางประเภทเพื่อแยกการอ้างอิงสกรรมกริยาทั้งหมดในคราวเดียวแทนที่จะเป็นแบบตัวต่อตัวหรือไม่?


ในบางครั้งเราจำเป็นต้องใช้ไลบรารีเวอร์ชันล่าสุดว่า Spring 2.5.6 แต่การพึ่งพาอื่น ๆ รวมถึงเวอร์ชั่นที่เก่ากว่าเช่น struts2-spring-plugin (2.1.6) รวมถึง Spring 2.5.3 ในสถานการณ์ดังกล่าวมีข้อกำหนดสำหรับการยกเว้นหรือแทนที่รุ่น
Vinod Singh เมื่อ

1
ใช้ไม้เลื้อย ผมล้อเล่น.
Jake Toronto

คำตอบ:


54

สำหรับ maven2 ไม่มีวิธีที่จะทำสิ่งที่คุณอธิบาย สำหรับ Maven 3 มี หากคุณใช้ maven 3 โปรดดูคำตอบอื่นสำหรับคำถามนี้

สำหรับ Maven 2 ฉันขอแนะนำให้สร้าง pom ที่กำหนดเองของคุณเองสำหรับการอ้างอิงที่มี <exclusions> ของคุณ สำหรับโครงการที่จำเป็นต้องใช้การพึ่งพานั้นให้ตั้งค่าการพึ่งพา pom ที่กำหนดเองของคุณแทนที่จะเป็นสิ่งประดิษฐ์ทั่วไป แม้ว่าจะไม่อนุญาตให้คุณยกเว้นการพึ่งพาสกรรมกริยาทั้งหมดด้วย <exclusion> เดียว แต่ก็ช่วยให้คุณต้องเขียนการพึ่งพาของคุณเพียงครั้งเดียวและโครงการทั้งหมดของคุณไม่จำเป็นต้องเก็บรักษารายการที่ไม่จำเป็นและยาว


12
ฉันอยากจะแนะนำไม่ให้ทำ pom ของคุณเองเพื่อหลีกเลี่ยงข้อยกเว้น สิ่งนี้ทำให้งานสร้างของคุณมีขนาดเล็กลงพกพาสะดวกและลดความเข้าใจ
Brian Fox

1
ในกรณีที่คุณไม่ได้มองผ่านการยอมรับ anwser: jira.codehaus.org/browse/MNG-3832
Jakub Bochenski

@JakubBochenski คำตอบที่ฉันได้รับนั้นเฉพาะกับ maven 2 ซึ่งเป็นสิ่งที่คำถามนี้ถูกแท็กด้วย (ในขณะที่ฉันเขียนความคิดเห็นนี้) ลิงก์ของคุณมีความเกี่ยวข้องเฉพาะกับ Maven 3. ไม่ว่าฉันจะแก้ไขคำตอบของฉันเพื่อลิงก์ไปยังลิงก์ไปยังคำตอบที่มีผู้โหวตมาก
Whaley

306

สิ่งที่ได้ผลสำหรับฉัน (อาจเป็นฟีเจอร์ที่ใหม่กว่าของ Maven) เพียงทำสัญลักษณ์แทนในองค์ประกอบการยกเว้น

ฉันมีโครงการหลายโมดูลที่มีโมดูล "แอพ" ที่อ้างอิงในสองโมดูลที่ทำแพ็กเกจสงคราม หนึ่งในโมดูลที่บรรจุในชุดสงครามนั้นต้องการเพียงแค่คลาสโดเมน (และฉันยังไม่ได้แยกออกจากโมดูลแอพ) ฉันพบสิ่งนี้เพื่อทำงาน:

<dependency>
    <groupId>${project.groupId}</groupId>
    <artifactId>app</artifactId>
    <version>${project.version}</version>
    <exclusions>
        <exclusion>
            <groupId>*</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>

wildcard บนทั้ง groupId และ artifactId ไม่รวมการพึ่งพาทั้งหมดที่ปกติจะเผยแพร่ผ่านไปยังโมดูลโดยใช้การพึ่งพานี้


9
อักขระตัวแทน * สำหรับกลุ่มและสิ่งประดิษฐ์ดูเหมือนว่าจะทำงานใน maven 3
nkr1pt

22
ฉันไม่ทราบว่าคุณสามารถค้นหาการทำงานนี้ได้อย่างไรเนื่องจาก Maven 3 เตือนอย่างชัดเจนเกี่ยวกับการใช้เครื่องหมายดอกจัน: [คำเตือน] 'dependencies.dependency.exclusions.exclusions.exclusion.groupId' สำหรับ <artifcat_id> ที่มีค่า "*" ไม่ จับคู่รูปแบบรหัสที่ถูกต้อง [คำเตือน] ขอแนะนำเป็นอย่างยิ่งให้แก้ไขปัญหาเหล่านี้เพราะพวกเขาคุกคามความมั่นคงของงานสร้างของคุณ [คำเตือน] ด้วยเหตุผลนี้เวอร์ชัน Maven ในอนาคตอาจไม่สนับสนุนการสร้างโครงการที่มีรูปแบบไม่ถูกต้องอีกต่อไปคุณจะต้องแสดงหลักฐานว่ามีการสนับสนุนและสามารถใช้งานได้หรือไม่ มิฉะนั้นฉันจะถือว่าความคิดเห็นของคุณเป็นความเข้าใจผิดอย่างยิ่ง
ᄂ ᄀ

7
ทำงานอย่างสวยงามด้วย Maven 3.0.4 ขอบคุณมาก !
Evgeny Goldin

1
maven 3.0.4 -> มันใช้งานไม่ได้สำหรับฉัน jar ที่ได้รับนั้นแตกต่างกันมากเมื่อฉันใช้ asterix หรือเมื่อฉันแยกการพึ่งพาโดยตรงทั้งหมดอย่างชัดเจน มันอาจจะเกี่ยวข้องกับข้อเท็จจริงที่ฉันใช้ maven-assembly-plugin เพื่อสร้าง jar ไขมัน ในกรณีนี้คำแนะนำที่ไม่สามารถใช้ได้!
gilad hoch

31
วิธีนี้ใช้ได้ พวกเขาแก้ไขคำเตือนว่าคนอื่นรายงานใน maven 3.2.1: problems.apache.org/jira/browse/MNG-3832
Ryan

32

สิ่งหนึ่งที่ฉันพบว่ามีประโยชน์:

หากคุณใส่การพึ่งพาพร้อมกับการยกเว้นในส่วนการพึ่งพาการจัดการของ POM หลักสำหรับโครงการของคุณหรือใน POM การจัดการการพึ่งพาที่นำเข้าได้คุณไม่จำเป็นต้องทำการแยกซ้ำ (หรือรุ่น)

ตัวอย่างเช่นถ้า POM แม่ของคุณมี:

<dependencyManagement>
    <dependencies>
    ...         
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.2.1</version>
            <exclusions>
                <exclusion>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
     ....
  </dependencies>
</dependencyManagement>

จากนั้นโมดูลในโครงการของคุณสามารถประกาศการพึ่งพาเป็น:

        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
        </dependency>

ใน POM พาเรนต์จะระบุทั้งเวอร์ชันและการยกเว้น ฉันใช้เทคนิคนี้สำหรับโครงการเกือบทั้งหมดของเราและกำจัดการทำซ้ำมาก


23

สามปีที่แล้วฉันแนะนำให้ใช้เวอร์ชัน 99 ไม่มีอยู่ แต่ตอนนี้ฉันหาวิธีที่ดีกว่าโดยเฉพาะอย่างยิ่งตั้งแต่เวอร์ชัน 99 ออฟไลน์:

ใน POM พาเรนต์ของโปรเจ็กต์ของคุณให้ใช้maven-enforcer-pluginเพื่อล้มเหลวการ build หากการพึ่งพาที่ไม่ต้องการคืบคลานเข้าสู่บิลด์ สิ่งนี้สามารถทำได้โดยใช้กฎการพึ่งพาของปลั๊กอินที่ถูกแบน :

<plugin>
    <artifactId>maven-enforcer-plugin</artifactId>
    <version>1.0.1</version>
    <executions>
        <execution>
            <id>only-junit-dep-is-used</id>
            <goals>
                <goal>enforce</goal>
            </goals>
            <configuration>
                <rules>
                    <bannedDependencies>
                        <excludes>
                            <exclude>junit:junit</exclude>
                        </excludes>
                    </bannedDependencies>
                </rules>
            </configuration>
        </execution>
    </executions>
</plugin>

จากนั้นเมื่อแจ้งเตือนคุณเกี่ยวกับการพึ่งพาที่ไม่ต้องการให้แยกออกใน<dependencyManagement>ส่วนของ POM หลัก:

<dependency>
    <groupId>org.springframework.batch</groupId>
    <artifactId>spring-batch-test</artifactId>
    <version>2.1.8.RELEASE</version>
    <exclusions>
        <exclusion>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </exclusion>
    </exclusions>
</dependency>

วิธีนี้การพึ่งพาที่ไม่พึงประสงค์จะไม่ปรากฏขึ้นโดยไม่ตั้งใจ (ซึ่งแตกต่างจาก<exclusion>ที่ง่ายต่อการลืม) จะไม่สามารถใช้งานได้แม้ในช่วงเวลารวบรวม (ต่างจากprovidedขอบเขต) ไม่มีการพึ่งพาปลอม (ต่างจากเวอร์ชั่น 99) และ ' จะทำงานโดยไม่มีที่เก็บข้อมูลที่กำหนดเอง (ต่างจากเวอร์ชั่น 99) วิธีการนี้จะทำงานได้ตามเวอร์ชันตัวแยกประเภทขอบเขตหรือรหัสกลุ่มทั้งหมดของวัตถุ - ดูเอกสารประกอบสำหรับรายละเอียด


หมายเหตุว่าอย่างน้อยภายใต้ Maven 3.1 จะถูกละเว้นเมื่อมีการดำเนินเป้าหมายจากบรรทัดคำสั่งและจะต้องขยับขึ้นโดยตรงภายใต้<configuration> <plugin>
David Harkness

ฉันเพิ่งพบสิ่งที่ดูเหมือนว่าข้อผิดพลาด Maven น่ารังเกียจ - รุ่น 3.5.2 ฉันมีโครงการที่มี submodules ที่ฉันไม่รวมการพึ่งพาที่<dependencyManagement>ส่วนของผู้ปกครอง การเรียกใช้mvn dependency:treeในโครงการเฉพาะนั้นจะไม่มีการอ้างอิงที่แยกออกเลย แต่โครงการทั้งหมดที่นำเข้านั้นการพึ่งพานั้นจะไม่ให้เกียรติ<exclusions>จากโครงการผู้ปกครองอื่น ๆ - โครงการที่แยกออกจะคืบคลานเข้า !!! ฉันต้องย้าย<exclusions>ไปที่แต่ละโมดูล pom โดยตรง
cbaldan

11

ฉันใช้วิธีแก้ปัญหาต่อไปนี้: แทนที่จะพยายามแยกสิ่งประดิษฐ์ในการอ้างอิงที่เหมาะสมทั้งหมดฉันวาดการพึ่งพาเป็น "กำหนด" ที่ระดับบนสุด ตัวอย่างเช่นเพื่อหลีกเลี่ยงการจัดส่ง xml-apis "รุ่นใดก็ตาม":

    <dependency>
        <groupId>xml-apis</groupId>
        <artifactId>xml-apis</artifactId>
        <version>[1.0,]</version>
        <scope>provided</scope>
    </dependency>


6

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

รวมถึงการพึ่งพาใน runtime บรรจุภัณฑ์ใด ๆ ที่คุณสามารถใช้ Maven พึ่งพาปลั๊กอินของเป้าหมายสำเนาสำหรับสิ่งประดิษฐ์ที่เฉพาะเจาะจง


1
นี้ช่วยให้ฉันหลีกเลี่ยงปัญหาเกี่ยวกับคอมไพเลอร์ของ Android Dalvik ซึ่งไม่สามารถจัดการกับบางส่วนของสองระดับรวมสกรรมกริยา --- แต่ผมใช้แทน<scope>provided</scope> <scope>runtime</scope>
Garret Wilson

6

หากคุณต้องการแยกการอ้างอิงสกรรมกริยาทั้งหมดออกจากส่วนการพึ่งพาที่คุณจะรวมในแอสเซมบลีคุณสามารถระบุสิ่งนี้ใน descriptor สำหรับแอสเซมบลีปลั๊กอิน:

<assembly>
    <id>myApp</id>
    <formats>
        <format>zip</format>
    </formats>
    <dependencySets>
        <dependencySet>
            <useTransitiveDependencies>false</useTransitiveDependencies>
            <includes><include>*:struts2-spring-plugin:jar:2.1.6</include></includes>
        </dependencySet>
    </dependencySets>
</assembly>

3

หากคุณพัฒนาภายใต้ Eclipse คุณสามารถในกราฟ POM Editor (เปิดใช้งานแท็บขั้นสูง) ค้นหาการพึ่งพาที่คุณต้องการแยกโครงการของคุณแล้ว:

คลิกขวาที่มัน -> "ยกเว้น Maven Artifact ... " และ Eclipse จะทำการยกเว้นสำหรับคุณโดยไม่จำเป็นต้องค้นหาว่าพึ่งพาลิงค์ใด


โปรดทราบว่าจะใช้งานได้เฉพาะเมื่อคุณใช้ปลั๊กอิน m2eclipse
Nicolas Mommaerts

2

คุณมีเหตุผลอะไรในการยกเว้นการพึ่งพาสกรรมกริยาทั้งหมด?

หากมีสิ่งประดิษฐ์เฉพาะ (เช่นการบันทึกทั่วไป) ที่คุณต้องแยกออกจากการอ้างอิงทุกครั้งวิธีการที่ไม่มีอยู่ในเวอร์ชัน 99อาจช่วยได้


อัปเดต 2012:อย่าใช้วิธีนี้ ใช้Maven-สั่งปลั๊กอินและการยกเว้น เวอร์ชัน 99 สร้างการอ้างอิงปลอมและที่เก็บเวอร์ชัน 99 ออฟไลน์ (มีมิเรอร์ที่คล้ายกันแต่คุณไม่สามารถไว้ใจให้พวกเขาออนไลน์ตลอดไปได้ดีที่สุดคือใช้ Maven Central เท่านั้น)


1

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


-2

ใช้ Maven ล่าสุดใน classpath ของคุณ .. มันจะลบสิ่งประดิษฐ์ที่ซ้ำกันและเก็บสิ่งประดิษฐ์ Maven ล่าสุด ..

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