天天看點

maven傳遞性依賴與NoSuchMethodError

    對于maven, 很多人看似很熟悉,其實貌似根本不了解,本文旨在解決某些方面的疑惑。

       當我在service子產品引入公司某業務的一個接口,由于該接口依賴了公司寫的各種東西和spring等第三方依賴,是以我一下子啥都不用顯示依賴了,這叫傳遞性。而dependencymanagement的作用在于仍然讓子子產品顯示寫依賴,但依賴的版本和設定不用寫了,簡化了。關于jar包的傳遞依賴,你可以在idea的maven視窗中標明子子產品右鍵show dependencies。

       在idea環境中,有時你不得不執行reimport和clean,才能看到jar包引入。另外,請注意你寫的version是倉庫中确實存在的。

       如果公司沒有maven私服,完全依賴apache maven庫,也許是夠用的,碰到其他公司的接口需要你引入他們的jar包時,可以把jar包放在jvm/ext/lib下。

       值得一提的是,在子產品組織方面,你完全可以把緊密相關的幾個系統的放在一起,各個系統的web子產品公用一套common, do及dao子產品,而不必為每個系統打開一個idea視窗。

       pom裡已經引入dependency,但很多時候我們需要reimport一下甚至很多下才能看到jar包被真正引入,如果module被ignore了,那麼也很可能引入不了jar包。注意,隻要dependency沒變紅,就是ok的。

       本地install時,請把目前子產品依賴的子產品先install一下。

       本地測試時,idea開啟了自動indexing時,很有可能遠端的包會覆寫本地的包,導緻本地要重新install。

       maven的傳遞性依賴會導緻間接進入一些包而與顯示引入的發生沖突,例如,某依賴間接引入了spring2.5.6,子產品裡顯示依賴的是spring3.1.1,spring2.5.6裡threadpooltaskexecutor沒有submit(runnable)方法,spring3.1.1裡有,程式運作時極有可能加載spring2.5.6的threadpooltaskexecutor.class而發生java.lang.nosuchmethoderror。

maven其他注意點:

  由于曆史原因,maven的核心插件之一——compiler插件預設隻支援編譯java 1.3,是以需要配置該插件使其支援java 5.

典型的maven配置示例:

 父pom

maven傳遞性依賴與NoSuchMethodError

<?xml version="1.0" encoding="utf-8"?>  

<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>com.ixhong</groupid>  

    <artifactid>ixhong</artifactid>  

    <packaging>pom</packaging>  

    <version>1.0-snapshot</version>  

    <modules>  

        <module>ixhong-common</module>  

        <module>ixhong-admin-web</module>  

        <module>ixhong-domain</module>  

        <module>ixhong-dao</module>  

        <module>ixhong-manager</module>  

        <module>ixhong-fs-web</module>  

        <module>ixhong-support-web</module>  

        <module>ixhong-lender-web</module>  

        <module>ixhong-base</module>  

        <module>ixhong-tomcat-web</module>  

    </modules>  

    <properties>  

        <spring.version>3.2.11.release</spring.version>  

        <ibatis.version>3.2.7</ibatis.version>  

        <rootdir>${basedir}</rootdir>  

    </properties>  

    <dependencies>  

        <dependency>  

            <groupid>commons-lang</groupid>  

            <artifactid>commons-lang</artifactid>  

            <version>2.6</version>  

        </dependency>  

            <groupid>commons-collections</groupid>  

            <artifactid>commons-collections</artifactid>  

            <version>3.2.1</version>  

            <groupid>commons-codec</groupid>  

            <artifactid>commons-codec</artifactid>  

            <version>1.10</version>  

        <!-- -->  

            <groupid>log4j</groupid>  

            <artifactid>log4j</artifactid>  

            <version>1.2.12</version>  

    </dependencies>  

    <dependencymanagement>  

        <dependencies>  

            <dependency>  

                <groupid>javax.servlet</groupid>  

                <artifactid>javax.servlet-api</artifactid>  

                <version>3.0.1</version>  

                <scope>provided</scope>  

            </dependency>  

                <groupid>redis.clients</groupid>  

                <artifactid>jedis</artifactid>  

                <version>2.8.0</version>  

                <groupid>org.apache.struts</groupid>  

                <artifactid>struts2-core</artifactid>  

                <version>2.2.3.1</version>  

                <groupid>org.apache.tomcat</groupid>  

                <artifactid>tomcat-catalina</artifactid>  

                <version>7.0.57</version>  

                <artifactid>tomcat-coyote</artifactid>  

        </dependencies>  

    </dependencymanagement>  

    <!--<scm>  

        <connection>scm:git:[email protected]:qwexyz/qwexyz.git</connection>  

        <url>scm:git:[email protected]:qwexyz/qwexyz.git</url>  

        <developerconnection>scm:git:[email protected]:qwexyz/qwexyz.git</developerconnection>  

    </scm>-->  

    <build>  

        <plugins>  

            <plugin>  

                <artifactid>maven-compiler-plugin</artifactid>  

                <version>3.1</version>  

                <configuration>  

                    <source>1.6</source>  

                    <target>1.6</target>  

                    <encoding>utf-8</encoding>  

                </configuration>  

            </plugin>  

                <artifactid>maven-resources-plugin</artifactid>  

                <version>2.6</version>  

                <groupid>org.apache.maven.plugins</groupid>  

                <artifactid>maven-release-plugin</artifactid>  

                <version>2.1</version>  

        </plugins>  

    </build>  

</project>  

  web

maven傳遞性依賴與NoSuchMethodError

    <parent>  

        <artifactid>ixhong</artifactid>  

        <groupid>com.ixhong</groupid>  

        <version>1.0-snapshot</version>  

    </parent>  

    <artifactid>ixhong-lender-web</artifactid>  

    <packaging>war</packaging>  

    <name>ixhong-user-web</name>  

    <url>http://maven.apache.org</url>  

    <!-- 依賴包 -->  

            <groupid>com.ixhong</groupid>  

            <artifactid>ixhong-manager</artifactid>  

            <version>1.0-snapshot</version>  

            <artifactid>ixhong-common</artifactid>  

            <groupid>org.mybatis</groupid>  

            <artifactid>mybatis-spring</artifactid>  

            <version>1.2.2</version>  

            <groupid>org.springframework</groupid>  

            <artifactid>spring-context</artifactid>  

            <version>${spring.version}</version>  

            <artifactid>spring-context-support</artifactid>  

            <artifactid>spring-webmvc</artifactid>  

            <artifactid>spring-jdbc</artifactid>  

            <groupid>mysql</groupid>  

            <artifactid>mysql-connector-java</artifactid>  

            <version>5.1.32</version>  

            <groupid>org.apache.velocity</groupid>  

            <artifactid>velocity</artifactid>  

            <version>1.7</version>  

            <groupid>javax.servlet</groupid>  

            <artifactid>javax.servlet-api</artifactid>  

            <version>3.0.1</version>  

            <scope>provided</scope>  

            <groupid>commons-dbcp</groupid>  

            <artifactid>commons-dbcp</artifactid>  

            <version>1.4</version>  

            <groupid>commons-fileupload</groupid>  

            <artifactid>commons-fileupload</artifactid>  

            <version>1.3.1</version>  

            <artifactid>velocity-tools</artifactid>  

            <version>2.0</version>  

            <exclusions>  

                <exclusion>  

                    <groupid>org.apache.struts</groupid>  

                    <artifactid>*</artifactid>  

                </exclusion>  

            </exclusions>  

            <groupid>org.apache.activemq</groupid>  

            <artifactid>activemq-client</artifactid>  

            <version>5.11.1</version>  

            <artifactid>spring-jms</artifactid>  

            <artifactid>spring-test</artifactid>  

            <scope>test</scope>  

            <groupid>junit</groupid>  

            <artifactid>junit</artifactid>  

            <version>4.8.2</version>  

        <finalname>root</finalname>  

        <outputdirectory>src/main/webapp/web-inf/classes</outputdirectory>  

        <resources>  

            <resource>  

                <directory>src/main/resources</directory>  

                <filtering>true</filtering>  

            </resource>  

        </resources>  

    <profiles>  

        <profile>  

            <id>development</id>  

            <activation>  

                <activebydefault>true</activebydefault>  

            </activation>  

            <build>  

                <filters>  

                    <filter>../profile/development.properties</filter>  

                </filters>  

            </build>  

        </profile>  

            <id>test</id>  

                    <filter>../profile/test.properties</filter>  

            <id>production</id>  

                    <filter>../profile/production.properties</filter>  

    </profiles>  

  dao

maven傳遞性依賴與NoSuchMethodError

    <artifactid>ixhong-dao</artifactid>  

    <packaging>jar</packaging>  

    <name>ixhong-dao</name>  

        <finalname>ixhong-dao</finalname>  

            <artifactid>ixhong-domain</artifactid>  

            <artifactid>mybatis</artifactid>  

            <version>${ibatis.version}</version>  

  domain

maven傳遞性依賴與NoSuchMethodError

    <artifactid>ixhong-domain</artifactid>  

    <name>ixhong-domain</name>  

        <finalname>ixhong-domain</finalname>  

            <groupid>net.sf.json-lib</groupid>  

            <artifactid>json-lib</artifactid>  

            <version>2.4</version>  

            <classifier>jdk15</classifier>  

maven的核心僅僅定義了抽象的生命周期,具體的任務是交由插件完成的,插件以獨立的建構形式存在,是以,maven核心的分發包隻有不到3mb的大小,maven會在需要的時候下載下傳并使用插件。一個插件可能會對應多個目标,一個目标就是一個功能,如maven-dependency-plugin有十多個目标,dependency:analyze,dependency:tree,dependency:list等。

可以使用jetty-maven-plugin啟動web應用進行測試。

配置檔案

settings.xml中的profile是pom.xml中的profile的簡潔形式。它包含了激活(activation),倉庫(repositories),插件倉庫(pluginrepositories)和屬性(properties)元素。profile元素僅包含這四個元素是因為他們涉及到整個的建構系統,而不是個别的pom配置。

如果settings中的profile被激活,那麼它的值将重載pom或者profiles.xml中的任何相等id的profiles。

激活(activation)

activations是profile的關鍵,就像pom中的profiles,profile的能力在于它在特定情況下可以修改一些值。而這些情況是通過activation來指定的。

maven傳遞性依賴與NoSuchMethodError

<settings xsi:schemalocation="http://maven.apache.org/settings/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd" xmlns="http://maven.apache.org/settings/1.0.0"  

    xmlns:xsi="http://www.w3.org/2001/xmlschema-instance">  

  <profiles>  

    <profile>  

      <repositories>  

        <repository>  

          <snapshots>  

            <enabled>false</enabled>  

          </snapshots>  

          <id>central</id>  

          <name>libs-releases</name>  

          <url>http://maven.whatsmars.com/libs-releases</url>  

        </repository>  

          <snapshots />  

          <id>snapshots</id>  

          <name>libs-snapshots</name>  

          <url>http://maven.whatsmars.com/libs-snapshots</url>  

      </repositories>  

      <pluginrepositories>  

        <pluginrepository>  

          <name>plugins-releases</name>  

          <url>http://maven.whatsmars.com/plugins-releases</url>  

        </pluginrepository>  

          <name>plugins-snapshots</name>  

          <url>http://maven.whatsmars.com/plugins-snapshots</url>  

      </pluginrepositories>  

      <id>artifactory</id>  

    </profile>  

  </profiles>  

  <activeprofiles>  

    <activeprofile>artifactory</activeprofile>  

  </activeprofiles>  

</settings>  

 mvn package-dskiptests  打包并且跳過測試

mvn clean install-pdev  激活dev下的profile,這樣properties中的配置就會替換成實際值

maven可繼承的pom元素

maven傳遞性依賴與NoSuchMethodError

groupid :項目組 id ,項目坐标的核心元素;  

version :項目版本,項目坐标的核心元素;  

description :項目的描述資訊;  

organization :項目的組織資訊;  

inceptionyear :項目的創始年份;  

url :項目的 url 位址  

develoers :項目的開發者資訊;  

contributors :項目的貢獻者資訊;  

distributionmanagerment :項目的部署資訊;  

issuemanagement :缺陷跟蹤系統資訊;  

cimanagement :項目的持續繼承資訊;  

scm :項目的版本控制資訊;  

mailinglistserv :項目的郵件清單資訊;  

properties :自定義的 maven 屬性;  

dependencies :項目的依賴配置;  

dependencymanagement :醒目的依賴管理配置;  

repositories :項目的倉庫配置;  

build :包括項目的源碼目錄配置、輸出目錄配置、插件配置、插件管理配置等;  

reporting :包括項目的報告輸出目錄配置、報告插件配置等。  

原文連結:[http://wely.iteye.com/blog/2270414]