跳至主要內容

maven

chanchaw大约 6 分钟language

概述

Maven 不需要安装,从官方下载来的只是个压缩包,需要设置环境变量才可以在命令行使用对应命令

编译打包案例

能源采集comm

做项目 showaMeter 时用到了串口开发,使用到 RXTXcomm.jar,完整的 pom.xml 文件内容如下

pom.xml
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.xdf</groupId>
    <artifactId>showaMeter</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>showaMeter</name>
    <description>showaMeter</description>
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.6.13</spring-boot.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- 以下是手动添加的依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.43</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.25</version>
        </dependency>
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
            <version>1.6.2</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.16</version>
        </dependency>
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.mybatis-flex</groupId>
            <artifactId>mybatis-flex-spring-boot-starter</artifactId>
            <version>1.7.5</version>
        </dependency>
        <dependency>
            <groupId>com.cc</groupId>
            <artifactId>RXTXcomm</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/lib/RXTXcomm.jar</systemPath>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <!-- 编译器插件:不需要extdirs配置 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>

            <!-- Spring Boot插件:添加includeSystemScope -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.xdf.showameter.ShowaMeterApplication</mainClass>
                    <includeSystemScope>true</includeSystemScope>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>

        <!-- 主要配置:将引用的第三方 jar 包打进生成的 jar 文件的 BOOT-INF/lib 目录中 -->
        <!--        <resources>-->
        <!--            <resource>-->
        <!--                <directory>lib</directory>-->
        <!--                <targetPath>BOOT-INF\lib</targetPath>-->
        <!--            </resource>-->
        <!--            <resource>-->
        <!--                <directory>src/main/resources</directory>-->
        <!--            </resource>-->
        <!--        </resources>-->
    </build>
</project>

关键配置


原本 maven-compiler-plugin 的配置如下

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.1</version>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <encoding>UTF-8</encoding>
        <compilerArguments>
            <extdirs>${project.basedir}/lib</extdirs>
        </compilerArguments>
    </configuration>
</plugin>

后来咨询 deepseek 后把上面的 extdirs 去掉了,使用了 <scope>system</scope> 的依赖 RXTXcomm 在参数 systemPath 的配合下在源码运行时能够找到文件所在路径,但是使用 maven 打包时不会被纳入打包后的 jar 文件(标签 <scope>system</scope> 的原因),就会导致编译后的最终 jar 无法成功启动。在 spring-boot-maven-pluginplugin 中通过使用 <includeSystemScope>true</includeSystemScope> 将外置的依赖 RXTXcomm.jar 重新纳入编译后的 jar 中。此时该依赖在工程根目录下的 lib 下,之前迅达的呼叫中心项目该依赖在 src/main/resources/lib 下,即本项目采用的依赖路径方法不同于迅达的呼叫中心

注意:

将编译后的 jar 部署到服务器上时要将依赖文件 rxtxSerial.dll,rxtxParallel.dll 同时拷贝到 windows 系统目录 C:\Windows\System32C:\Windows\SysWOW64

配置文件 settings.xml

在保证魔法可用的情况下使用下面的配置,可正常下载大多数依赖

<settings>

<mirrors>
    <mirror>
        <id>aliyun-maven</id>
        <mirrorOf>*</mirrorOf>
        <name>阿里云公共仓库</name>
        <url>https://maven.aliyun.com/repository/public</url>
    </mirror>
</mirrors>

<profiles>
    <profile>
        <id>aliyun-repos</id>
        <repositories>
            <repository>
                <id>aliyun-public</id>
                <url>https://maven.aliyun.com/repository/public</url>
                <releases>
                    <enabled>true</enabled>
                </releases>
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
            </repository>
            <repository>
                <id>aliyun-spring</id>
                <url>https://maven.aliyun.com/repository/spring</url>
            </repository>
            <repository>
                <id>aliyun-google</id>
                <url>https://maven.aliyun.com/repository/google</url>
            </repository>
        </repositories>
    </profile>
</profiles>

<!-- 激活配置 -->
<activeProfiles>
    <activeProfile>aliyun-repos</activeProfile>
</activeProfiles>

</settings>

JSP项目不识别类型

2024年9月在WIN10系统中重新安装 IDEA 2022.3.2 后修改其默认的内置 maven 为自己下载的 maven 会导致从仓库拉下 PADEMIS 项目源码时无法自动识别项目类型,最终无法运行。本次将自定义的外部 maven 的配置文件拷贝到 IDEA 的目录下,其中指定了使用淘宝的镜像,并指定了依赖下载后的存放路径,由此可解决前面的问题

本文件中修改了仓库镜像为淘宝的镜像,将本文件拷贝到 C:\Users\admin\.m2 下,作为 IDEA 集成的 maven 的配置文件。重新下载源码等待自动执行:下载依赖、下载插件、索引文件完毕后在配置项目 File > Project Structure

点我看 完整文件open in new window

代理网络

在标签 proxies 中添加下面代码

<proxy>
    <id>localclash</id> <!--代理服务器ID,可随意命名-->
    <active>true</active> <!-- 是否启用 -->
    <protocol>http</protocol> <!-- 通信协议 -->
    <username></username> <!-- 代理服务器用户名 -->
    <password></password> <!-- 代理服务器密码 -->
    <host>127.0.0.1</host> <!-- 代理服务器主机地址 -->
    <port>7890</port> <!-- 通信端口 -->
    <nonProxyHosts></nonProxyHosts>
</proxy>

下载地址

180阿里云盘:安装程序与软件 -> 开发与实施 -> web开发 -> Maven3.8.1.zip

解压部署

本压缩包解压后得到下面两个目录
image.png 其中 apache-maven-localRepository 是本地仓库,之后的依赖 jar 都会下载到改目录中

修改本地仓库地址

编辑配置文件 C:\Maven\apache-maven-3.8.1\conf\settings.xml 如下

image.png
image.png
<mirror>
  <id>alimaven</id>
  <name>aliyun maven</name>
  <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  <mirrorOf>central</mirrorOf>
</mirror>

设置中央仓库镜像地址为阿里

编辑配置文件 C:\Maven\apache-maven-3.8.1\conf\settings.xml image.png

设置环境变量

image.png 注册环境变量后才能使用:mvn -v 查看版本号,才能将本地 jar 纳入本地仓库中 如果仍然提示没有 maven 的命令,在上面系统环境变量的 path 中添加:%MAVEN_HOME%\bin 记得要重新打开 cmd

把jar导入本地maven库

先通过命令:mvn -v 检测环境变量是否设置成功了(必须先做上面的环境变量注册才能使用 mvn 命令),之后通过命令(将本地 FineReport Jar 纳入本地仓库):

call mvn install:install-file  -Dfile=D:\Java\finereport9.0\WebReport\WEB-INF\lib\fr-core-9.0.jar  -DgroupId=com.fr  -DartifactId=fr-core -Dversion=9.0 -Dpackaging=jar
call mvn install:install-file  -Dfile=D:\Java\finereport9.0\WebReport\WEB-INF\lib\fr-report-9.0.jar  -DgroupId=com.fr  -DartifactId=fr-report -Dversion=9.0 -Dpackaging=jar
call mvn install:install-file  -Dfile=D:\Java\finereport9.0\WebReport\WEB-INF\lib\fr-third-9.0.jar  -DgroupId=com.fr  -DartifactId=fr-third -Dversion=9.0 -Dpackaging=jar
call mvn install:install-file  -Dfile=D:\Java\finereport9.0\WebReport\WEB-INF\lib\fr-performance-9.0.jar  -DgroupId=com.fr  -DartifactId=fr-performance -Dversion=9.0 -Dpackaging=jar
call mvn install:install-file  -Dfile=D:\Java\finereport9.0\WebReport\WEB-INF\lib\fr-platform-9.0.jar  -DgroupId=com.fr  -DartifactId=fr-platform -Dversion=9.0 -Dpackaging=jar
call mvn install:install-file  -Dfile=D:\Java\finereport9.0\WebReport\WEB-INF\lib\fr-chart-9.0.jar  -DgroupId=com.fr  -DartifactId=fr-chart -Dversion=9.0 -Dpackaging=jar
call mvn install:install-file  -Dfile=D:\Java\finereport9.0\WebReport\WEB-INF\lib\fr-datasource-9.0.jar  -DgroupId=com.fr  -DartifactId=fr-datasource -Dversion=9.0 -Dpackaging=jar
call mvn install:install-file  -Dfile=D:\Java\finereport9.0\WebReport\WEB-INF\lib\fr-designer-chart-9.0.jar  -DgroupId=com.fr  -DartifactId=fr-designer-chart -Dversion=9.0 -Dpackaging=jar
call mvn install:install-file  -Dfile=D:\Java\finereport9.0\WebReport\WEB-INF\lib\fr-designer-core-9.0.jar  -DgroupId=com.fr  -DartifactId=fr-designer-core -Dversion=9.0 -Dpackaging=jar
call mvn install:install-file  -Dfile=D:\Java\finereport9.0\WebReport\WEB-INF\lib\fr-designer-report-9.0.jar  -DgroupId=com.fr  -DartifactId=fr-designer-report -Dversion=9.0 -Dpackaging=jar

将本地 jar 导入本地 maven 库中,可以看到 -Dfile 后面是 jar 文件所在的绝对路径

jdk.internal.org.objectweb.asm.commons不存在

2020年8月29日 10:04:43 在IDEA中使用 maven 打包 jar 文件报错:程序包jdk.internal.org.objectweb.asm.commons不存在,如下图 image.png 需要添加下面的插件

<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <source>1.8</source>
    <target>1.8</target>
    <encoding>UTF-8</encoding>
    <compilerArguments>
      <verbose />
      <!--
				将jdk的依赖jar打入项目中,这样项目中使用的jdk的依赖就尅正常使用
				注意 win 是英文分号间隔,linux 是英文冒号
			-->
      <bootclasspath>${java.home}/lib/rt.jar;${java.home}/lib/jce.jar;${java.home}/lib/jsse.jar</bootclasspath>
    </compilerArguments>
  </configuration>
</plugin>