Maven 筆記

使用 Project 資料夾內的 jars

有時候並不是所有的函式庫都有上傳到 Maven Central Repository,解決辦法除了架設私服之外,還可以在 pom.xml 中指定使用資料夾內的 jar 檔

<dependency>
    <groupId>org.jgap</groupId>
    <artifactId>JGAP</artifactId>
    <version>3.4.4</version>
    <scope>system</scope>
    <systemPath>${basedir}/lib/jgap-3.4.4.jar</systemPath>
</dependency>

${basedir} 就是 Project 的根目錄

把dependency打包進一個 jar 檔

跟 Fat Jar 功能一樣,只要使用 Assembly plugin 就可以完成這項工作,另外也可指定 main class 打包成單一可執行的 jar 檔,只要在 pom.xml 裡面設定 Assembly plugin 的參數就可以了。

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <archive>
            <!--指定 Main Class -->
            <manifest>
                <mainClass>somepackage.Main</mainClass>
            </manifest>
        </archive>
        <descriptorRefs>
            <!-- 打包需要的 jar -->
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
</plugin>

設定完成後使用 mvn assembly:assembly 就可以打包出含有依賴又可以執行的 jar 檔

另外如果 dependency 的 scope 設定為 system 會無法打包,基本上應該有解法,但是我沒找到,所以如果 dependency 不是來自 Central Repository 的話,還是安裝進 Local Repository 會比較簡單。

參考資料

排除 dependency 中的某個 dependency

有時 dependency 內還包有其他的 dependency,有時會引用 groupId 跟 artifactId 不同,但事實上是同樣的函式庫,所以要手動排除 dependency 內的 dependency。

<dependency>
  <groupId>jaxen</groupId>
  <artifactId>jaxen</artifactId>
  <version>1.1.1</version>
    <exclusions>
		<exclusion>
			<groupId>xerces</groupId>
			<artifactId>xmlParserAPIs</artifactId>
		</exclusion>
	</exclusions>
</dependency>

像是這個例子,jaxen 本來就有引用了 xml-apis 但,jaxen 內的 xom 又引用了 xmlParserAPIs,但是實際上 xml-apis 跟 xmlParserAPIs 是一樣的東西,所以有時就需要手動排除,至於要排除那一個最好看 dependency graph 來決定,盡量選依賴較少的 dependency。

取用不同 JDK 版本的 dependency

有時候有些 dependency 會有分給 JDK5 or JDK6,像是直接加上 json-lib 在 Maven 會出現 Missing artifact net.sf.json-lib:json-lib:jar:2.3:compile 的錯誤,那是因為 json-lib 有分成 JDK3 跟 JDK5 的版本,要解決這個問題就只要加上 classifier 來指定要用那一個版本的 json-lib。

<dependency>
    <groupId>net.sf.json-lib</groupId>
    <artifactId>json-lib</artifactId>
    <version>2.3</version>
    <classifier>jdk15</classifier>
</dependency>

參考資料

Follow 院長與芊比媽 on Google News