在使用Maven管理Java项目时,有时需要引入一些存放在系统特定位置的JAR文件。这些JAR文件可能是你自己编写的,也可能是其他来源的。无论是哪种情况,使用 Maven 的 system 范围和 systemPath 参数,可以方便地引入这些本地依赖。
Maven使用system范围与systemPath参数来引用本地的JAR文件。
当使用 system scope 指定依赖时,Maven会在系统中查找已经存在的该依赖,如果存在则直接使用,避免再次去远程仓库中查找。然而,如果该依赖在系统中不存在,后续操作依然会失败。因此,在使用 system 范围引入依赖之前,确保该依赖在你的系统中存在。这是一个需要注意的问题。
systemPath 参数用于指定依赖在系统中的绝对路径,这样 Maven 在编译时就可以直接使用这个路径来查找依赖。如果同一个依赖在工程中多次使用,重复指定 systemPath 参数比较繁琐。为了避免这种情况,可以考虑使用 Maven 的 project.parent 或 dependencyManagement 来进行统一管理。这样可以将依赖的版本、scope 等信息放在一个地方进行管理,使得项目结构更加清晰和易于维护。在实际项目中,这种方式往往会提高开发效率,减少错误的发生。
Maven项目中的一个 dependencies 配置,用于指定项目需要依赖的外部 jar 包。具体来说,这个配置中指定了一个 groupId 为 com.liboware,artifactId 为 my-jar,version 为 1.0 的外部 jar 包,并且给这个依赖设置了系统作用域(scope),同时指定了这个 jar 包在本地文件系统中的路径。
<dependencies>
<dependency>
<groupId>com.libowaregroupId>
<artifactId>my-jarartifactId>
<version>1.0version>
<scope>systemscope>
<systemPath>${project.basedir}/lib/my-jar.jarsystemPath>
dependency>
dependencies>
${project.basedir}/lib/my-jar.jar
。这种配置方式比较灵活,适用于一些需要使用本地 jar 包的场景,但同时也存在一些问题。由于使用 system 作用域时,Maven 不再管理依赖 jar 包的版本信息,这可能会导致不同版本的 jar 包之间冲突的问题,因此需要额外的注意依赖 jar 包的版本号和文件路径的正确性。
当使用 Maven 的打包插件 jar-with-dependencies 打包时,使用system作用域引入的依赖包将不会被包含在输出的可执行 jar 文件中。如果需要将本地依赖包打入可执行 jar 文件中,可以通过 Maven 的resources标签进行配置。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-shade-pluginartifactId>
<executions>
<execution>
<id>make-assemblyid>
<phase>packagephase>
<goals>
<goal>shadegoal>
goals>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependenciesdescriptorRef>
descriptorRefs>
<finalName>xxx-jar-with-dependenciesfinalName>
configuration>
execution>
executions>
plugin>
plugins>
<resources>
<resource>
<targetPath>lib/targetPath>
<directory>lib/directory>
<includes>
<include>**/*.jarinclude>
includes>
resource>
resources>
build>
这段 Maven 配置主要实现了使用 maven-shade-plugin
插件打包项目,并将依赖的第三方库和应用程序代码打包在一个可执行的 jar 文件中。同时,还将本地依赖包 *.jar
打包进可执行 jar 文件中。
具体来说,该配置包含以下内容:
maven-shade-plugin
插件配置:该插件用于打包和重写 jar 文件
descriptorRefs
:指定打包类型,这里配置为 jar-with-dependencies
,表示打出包含依赖的 jar 包finalName
:指定可执行 jar 包的文件名resources
配置:将本地依赖包打包进 jar 文件中
targetPath
:指定本地依赖包在 jar 中的存储路径directory
:指定本地依赖包的存储路径includes
:指定需要打包进 jar 文件中的本地依赖包总的来说,这个配置文件展示了一个简单的 Maven 打包过程的流程,通过 maven-shade-plugin
插件实现了将项目及其依赖(包括本地依赖包)打包在一个 jar 文件中的需求。
生成的 xxx-jar-with-dependencies.jar
将会包含 lib
目录以及其中的 *.jar
文件,该 jar 包在执行时可以找到这些依赖包。
但有时这种方法可能会失效,比如在声明 JDBCDriver
时,使用 Class.forName("xxx.Driver")
时可能会报类找不到的错误。此时可以使用以下两种方法来解决:
-cp
参数指定类路径,例如:java -cp xxx-jar-with-dependencies.jar:mysql-connector-java-8.0.25.jar com.example.Main
xxx-jar-with-dependencies.jar
,并在运行时手动调用 ClassLoader
加载该依赖包中的类。可以使用以下命令将 .jar
包安装到本地 Maven 仓库中:
mvn install:install-file -Dfile=my-jar.jar -DgroupId=com.liboware -DartifactId=my-jar -Dversion=1.0 -Dpackaging=jar
其中:
-Dfile
:指定要安装的 .jar
文件的位置和文件名。-DgroupId
:指定 Maven 项目的 GroupId。-DartifactId
:指定 Maven 项目的 ArtifactId。-Dversion
:指定 Maven 项目的版本号。-Dpackaging
:指定 Maven 项目的打包方式(例如:jar、war、pom 等)。如果你希望在一个新机器上执行 Maven 项目时不用运行 mvn install:install-file
命令,你可以将你的 .jar
包添加到项目的本地仓库中。
在项目的 pom.xml
文件中,可以声明一个
元素来定义项目的本地仓库。例如:
<repositories>
<repository>
<id>my-local-repositoryid>
<url>file://${project.basedir}/liburl>
repository>
repositories>
在上面的示例中,我们定义了一个 my-local-repository
的仓库,它的 URL 是 ${project.basedir}/lib
,也就是项目的 lib
文件夹。
现在,你可以将你的 .jar
包放到项目的 lib
文件夹下,当你执行 Maven 命令时,Maven 就会从这个 my-local-repository
仓库中查找你的 .jar
包了。
com.liboware
my-jar
1.0
你的jar包及路径必须严格遵循格式:
/groupId/artifactId/version/artifactId-verion.jar
本例中:lib/com/liboware/my-jar/1.0/my-jar-1.0.jar
Maven中,可用system
范围和systemPath
参数引用本地.jar
文件,或使用mvn install:install-file
命令安装到本地仓库。为了省去在新机器上安装的麻烦,需在pom.xml
文件中声明
元素指定本地仓库路径,以便Maven自动查找依赖。