มีวิธียกเว้นการพึ่งพา Maven ทั่วโลกหรือไม่?


93

ฉันกำลังพยายามหาวิธี "ทั่วไป" ในการยกเว้นการพึ่งพาสกรรมกริยาจากการรวมโดยไม่ต้องแยกออกจากการอ้างอิงทั้งหมดที่ขึ้นอยู่กับมัน ตัวอย่างเช่นหากฉันต้องการยกเว้น slf4j ฉันทำสิ่งต่อไปนี้:

  <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-jmx</artifactId>
    <version>3.3.2.GA</version>
    <exclusions>
      <exclusion>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
      </exclusion>
    </exclusions>
  </dependency>
  <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>3.4.0.GA</version>
    <type>jar</type>
    <exclusions>
      <exclusion>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
      </exclusion>
    </exclusions>
  </dependency>

นี่เป็นส่วนหนึ่งในการล้างไฟล์ pom ส่วนหนึ่งเพื่อหลีกเลี่ยงปัญหาในอนาคตเมื่อมีคนเพิ่มการอ้างอิงซึ่งขึ้นอยู่กับการพึ่งพาที่ยกเว้นนั้นและลืมที่จะยกเว้น

มีวิธีไหม?


2
ไม่สามารถแก้ปัญหาได้ แต่ maven-enforcer-plugin มีคุณสมบัติการอ้างอิงที่ถูกแบนซึ่งจะทำให้การสร้างล้มเหลวหากการอ้างอิงที่ไม่ต้องการแอบเข้ามาคุณยังคงต้องแยกพวกมันออกด้วยตนเองแม้ว่า: - /
dnault

มีคำตอบอื่นอยู่ที่นี่: stackoverflow.com/a/39979760/363573
Stephan

คำตอบ:


69

สิ่งนี้ช่วยได้หรือไม่? http://jlorenzen.blogspot.com/2009/06/maven-global-excludes.html

"สมมติว่าฉันต้องการแยก avalon-framework ออกจาก WAR ของฉันฉันจะเพิ่มสิ่งต่อไปนี้ในโปรเจ็กต์ POM ของฉันด้วยขอบเขตที่ให้มาซึ่งใช้งานได้กับการอ้างอิงสกรรมกริยาทั้งหมดและอนุญาตให้คุณระบุเพียงครั้งเดียว

<dependencies>
  <dependency>
      <artifactId>avalon-framework</artifactId>
      <groupId>avalon-framework</groupId>
      <version>4.1.3</version>
      <scope>provided</scope>
  </dependency>
</dependencies>

ซึ่งจะใช้งานได้เมื่อระบุใน POM หลักซึ่งจะป้องกันไม่ให้โปรเจ็กต์ต้องประกาศสิ่งนี้ใน POM ลูกทั้งหมด "


49
มันยังคงเป็นเพียงการแฮ็กบางส่วนเท่านั้นการพึ่งพาจะไม่สิ้นสุดใน build artifact แต่ยังคงใช้งานได้ในระหว่างการทดสอบ
Tuukka Mustonen

@TuukkaMustonen แล้วruntimeขอบเขตแทนที่จะเป็นprovidedขอบเขตล่ะ?
Stephan

จะเกิดอะไรขึ้นหากรวม avalon-framework 4.1.3+ ไว้ที่อื่นในโครงการ ดูคำตอบได้ที่นี่: stackoverflow.com/a/39979760/363573
Stephan

ฉันไม่ได้ใช้ Maven อีกต่อไปดังนั้นฉันจึงไม่สามารถทดสอบคำตอบอื่น ๆ ได้ แต่ฉันขอแนะนำให้ทุกคนพิจารณาพวกเขาในกรณีที่มีคำตอบที่ไม่ใช่การแฮ็กบางส่วนตาม @TuukkaMustonen
Joffer

18

ฉันสร้างขวดเปล่าและสร้างการอ้างอิงนี้:

<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <scope>system</scope>
    <systemPath>${basedir}/src/lib/empty.jar</systemPath>
    <version>0</version>
</dependency>

มันไม่สมบูรณ์แบบเพราะจากนี้ไปคุณมี jar ว่างในเส้นทางคอมไพล์ / ทดสอบ แต่นั่นเป็นเพียงเครื่องสำอาง


3
systemเลิกใช้ขอบเขตแล้ว: maven.apache.org/guides/introduction/…
Jason Young

เพื่อหลีกเลี่ยงการใช้systemขอบเขตโปรดดูเวอร์ชันที่เก็บ Maven เสมือน99.grons.nl (คำเตือน: HTTP เท่านั้น) หรือ (สำหรับการบันทึกแบบคอมมอนส์ / log4j เท่านั้น) ดู "ทางเลือก 3) สิ่งประดิษฐ์ที่ว่างเปล่า" ที่นี่: slf4j.org/faq.html#excludedJCL
seanf

16

หากต้องการขยายความคิดเห็นของ dnault :

เราสามารถใช้กฎห้ามการพึ่งพาของปลั๊กอิน Maven Enforcerเพื่อให้แน่ใจว่าการอ้างอิงจะถูกแยกออก ยังคงต้องมีการแยกออกด้วยตนเอง แต่การสร้างจะล้มเหลวหากใครก็ตามเพิ่มการอ้างอิงที่อื่นโดยไม่ได้ตั้งใจ

<dependencies>
  <dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-jmx</artifactId>
    <version>3.3.2.GA</version>
    <exclusions>
      <exclusion>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
      </exclusion>
    </exclusions>
  </dependency>
</dependencies>

<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-enforcer-plugin</artifactId>
    <version>1.4.1</version>
    <executions>
      <execution>
        <goals>
          <goal>enforce</goal>
        </goals>
        <configuration>
          <rules>
            <bannedDependencies>
              <excludes>
                <exclude>org.slf4j:slf4j-api</exclude>
              </excludes>
            </bannedDependencies>
          </rules>
        </configuration>
      </execution>
    </executions>
  </plugin>
</plugins>

นอกจากนี้ยังมีคำขอคุณลักษณะแบบเปิด: การยกเว้นการพึ่งพาทั่วโลก MNG-1977


2
ตามคำตอบของคุณและอ่านการอภิปรายจากลิงค์ที่คุณให้มาฉันรู้ว่าขวดโหลที่ไม่ต้องการกำลังเข้ามาในโถไขมันในบางครั้งเพียงเพราะเวอร์ชัน maven ที่ใช้บนโลคัลและบนเซิร์ฟเวอร์นั้นแตกต่างกันดังนั้นตรรกะของบรรจุภัณฑ์จึงสามารถเพิ่มการอ้างอิงเวอร์ชันที่แตกต่างกันได้หากไม่ได้บังคับใช้อย่างเคร่งครัด เพื่อแก้ปัญหาที่คล้ายกันของฉันฉันใช้ spring-boot-maven-plugin configuration / excludes / exclude สำหรับ <goal> repackage </goal>
aprodan

10

เพื่อเป็นการเตือนความจำนี่คือคำตอบจากเอกสารอย่างเป็นทางการของ Maven:

เหตุใดจึงมีการยกเว้นตามเกณฑ์การพึ่งพามากกว่าที่ระดับ POM

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

หากต้องการให้งานสร้างมีประสิทธิภาพมากขึ้นสามารถใช้ช่วงเวอร์ชันได้ สิ่งนี้จะช่วยให้มั่นใจได้ว่าไม่มีการพึ่งพาเวอร์ชันที่ใหม่กว่าสามารถแทรกแซงโครงการได้

<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-api</artifactId>
   <version>[1.4.2,)</version>
   <scope>provided</scope>
</dependency>

เวอร์ชัน slf4j-api> = 1.4.2 ใด ๆ จะได้รับการพิจารณาว่าเสนอ (ให้) ที่รันไทม์ไม่ว่าจะจากคลาสพา ธ ที่กำหนดค่าไว้หรือคอนเทนเนอร์

อ้างอิง

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