1.一般情況下jar包都可以使用pom.xml來配置管理,但也有一些時候,我們項目中使用了一個內部jar文件,但是這個文件我們又沒有開放到maven庫中。 我們會將文件放到我們項目中。(以下以java工程為例隨便放了個地方):

2. jar包的引入和使用:
右鍵項目 -> Build Path -> Configure Build Path ->Libraries ->Add External JARS

這時候我們就可以在工程里使用jar包了
package com.my.utils; import com.my.util.Book; public class Test { public static void main(String[] args) { // TODO Auto-generated method stub. Book book =new Book("English", 12.5); System.out.println(book); } }
但是如果我們不對pom.xml進行特殊配置的話,maven打包是不會自動去引用和編譯lib中的jar文件的,會出現類似如下錯誤
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.3:compile (default-compile) on project utils: Compilation failure: Compilation failure:
[ERROR] /C:/Users/Administrator/git/utils/src/main/java/com/my/utils/Test.java:[3,19] 程序包com.my.util不存在
[ERROR] /C:/Users/Administrator/git/utils/src/main/java/com/my/utils/Test.java:[9,17] 找不到符號
[ERROR] 符號: 類 Book
[ERROR] 位置: 類 com.my.utils.Test
[ERROR] /C:/Users/Administrator/git/utils/src/main/java/com/my/utils/Test.java:[9,32] 找不到符號
[ERROR] 符號: 類 Book
[ERROR] 位置: 類 com.my.utils.Test
所以需要我們修改下pom.xml文件。修改maven-compiler-plugin的配置,如下:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.3</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> <compilerArguments> <extdirs>${project.basedir}/src/main/resources/lib</extdirs> </compilerArguments> </configuration> </plugin> </plugins> </build>
3.如果是web項目,我們會將文件當到我們項目WEB-INF/lib中。

修改maven-compiler-plugin的配置,如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.7</source> <target>1.7</target> <encoding>UTF-8</encoding> <compilerArguments> <verbose /> <bootclasspath>${env.JAVA_HOME}/jre/lib/rt.jar</bootclasspath> <extdirs>${project.basedir}/src/main/webapp/WEB-INF/lib</extdirs> </compilerArguments> </configuration> </plugin>
其他配置是我的原來配置,針對lib引用這個問題,只需要增加的是:
<extdirs>${project.basedir}/src/main/webapp/WEB-INF/lib</extdirs>
不過在3.1版本以后maven-compiler-plugin將compilerArguments定為過時了,建議大家按下面的方法寫。
其中表示javac平時用空格隔開的的每一個參數。
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.7</source> <target>1.7</target> <encoding>UTF-8</encoding> <compilerArgs> <arg>-verbose</arg> <arg>-Xlint:unchecked</arg> <arg>-Xlint:deprecation</arg> <arg>-bootclasspath</arg> <arg>${env.JAVA_HOME}/jre/lib/rt.jar</arg> <arg>-extdirs</arg> <arg>${project.basedir}/src/main/webapp/WEB-INF/lib</arg> </compilerArgs> </configuration> </plugin>
其中${project.basedir}一定要寫,不然會出現“在windows”下可以正常編譯,在Linux服務器上就“有可能”出現編譯找不到jar包的錯誤。
另外科普一下,maven的目錄約定:
pom.xml所在的目錄應為項目的根目錄,假設該目錄為${proj-dir},那么Maven有以下假設:
${proj-dir}/src/main/java —— 存放項目的.java文件。
${proj-dir}/src/main/resources —— 存放項目資源文件,如spring, hibernate配置文件。
${proj-dir}/src/test/jave —— 存放所有測試.java文件,如JUnit測試類。
${proj-dir}/src/test/resources —— 測試資源文件。
${proj-dir}/target —— 項目輸出位置。
運行一條mvn clean package命令,Maven會幫你清除target目錄,重新建一個空的,編譯src/main/java類至target/classes,復制src/main/resources的文件至target/classes,編譯src/test/java至target/test-classes,復制src/test/resources的文件至target/test-classes;然后運行所有測試;測試通過后,使用jar命令打包,存儲於target目錄。Maven做的事情一點也不少,只是都對用戶隱蔽起來了,它只要求你遵循它的約定。
2018年8月25日 08:39:39
2019年6月21日 09:38:09
2020年4月24日 21:41:47
