Is there anyway to exclude artifacts inherited from a parent POM?

后端 未结 9 1193
礼貌的吻别
礼貌的吻别 2020-11-30 22:02

Artifacts from dependencies can be excluded by declaring an element inside a But in this case it\'s needed to

相关标签:
9条回答
  • 2020-11-30 22:46

    Have you tried explicitly declaring the version of mail.jar you want? Maven's dependency resolution should use this for dependency resolution over all other versions.

    <project>
      <modelVersion>4.0.0</modelVersion>
      <groupId>test</groupId>
      <artifactId>jruby</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <parent>
            <artifactId>base</artifactId>
            <groupId>es.uniovi.innova</groupId>
            <version>1.0.0</version>
        </parent>
        <dependencies>          
            <dependency>
                <groupId>javax.mail</groupId>
                <artifactId>mail</artifactId>
                <version>VERSION-#</version>
                <scope>provided</scope>
            </dependency> 
            <dependency>
                <groupId>com.liferay.portal</groupId>
                <artifactId>ALL-DEPS</artifactId>
                <version>1.0</version>
                <scope>provided</scope>
                <type>pom</type>
            </dependency>
        </dependencies>
    </project>
    
    0 讨论(0)
  • 2020-11-30 22:56

    Don't use a parent pom

    This might sound extreme, but the same way "inheritance hell" is a reason some people turn their backs on Object Oriented Programming (or prefer composition over inheritance), remove the problematic <parent> block and copy and paste whatever <dependencies> you need (if your team gives you this liberty).

    The assumption that splitting of poms into a parent and child for "reuse" and "avoidance of redunancy" should be ignored and you should serve your immediate needs first (the cure is worst than the disease). Besides, redundancy has its advantages - namely independence of external changes (i.e stability).

    This is easier than it sounds if you generate the effective pom (eclipse provides it but you can generate it from the command line with mvn help:effective).

    Example

    I want to use logback as my slf4j binding, but my parent pom includes the log4j dependency. I don't want to go and have to push the other children's dependence on log4j down into their own pom.xml files so that mine is unobstructed.

    0 讨论(0)
  • 2020-11-30 22:57

    When you call a package but do not want some of its dependencies you can do a thing like this (in this case I did not want the old log4j to be added because I needed to use the newer one):

    <dependency>
      <groupId>package</groupId>
      <artifactId>package-pk</artifactId>
      <version>${package-pk.version}</version>
    
      <exclusions>
        <exclusion>
          <groupId>org.apache.logging.log4j</groupId>
          <artifactId>log4j-core</artifactId>
        </exclusion>
        <exclusion>
          <groupId>org.apache.logging.log4j</groupId>
          <artifactId>log4j-api</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    
    <!-- LOG4J -->
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
      <version>2.5</version>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-api</artifactId>
      <version>2.5</version>
    </dependency>
    

    This works for me... but I am pretty new to java/maven so it is maybe not optimum.

    0 讨论(0)
提交回复
热议问题