zoukankan      html  css  js  c++  java
  • 1_Maven

    一. 引言

    1.1 项目管理问题

    • 项目中jar包资源越来越多, jar包的管理越来越沉重
    1.1.1 繁琐
    • 要为每个项目手动导入所需的jar, 需要搜集全部的jar
    1.1.2 复杂
    • 项目中的jar如果需要版本升级, 就需要重新搜集jar
    1.1.3 冗余

    相同的jar在不同的项目中保存了多份

    1.2 项目管理方案

    • Java项目需要一个统一的便捷的管理工具: Maven

    二. Maven介绍

    • Maven这个单词来自意第绪语(犹太语), 意为知识的积累
    • 是一个基于项目对象模型(POM)的概念的纯Java开发的开源的项目管理工具
    1. 主要用来管理java项目, 进行依赖管理
      • jar包依赖管理
    2. 项目构建
      • 项目编译, 打包, 测试, 部署
    3. 分块开发
      • 提高开发效率

    三. Maven安装

    3.1 下载

    下载链接: https://maven.apache.org/docs/history.html

    下载apache-maven-3.5.4-bin.zip (适用于Windows系统), 然后解压

    有如下目录

    • bin: 含有mvn运行的脚本
    • boot: 含有plexus-classworlds类加载器框架, Maven使用该框架加载自己的类库
    • conf: 含有setting.xml配置文件
    • lib: 含有maven运行时所需要的java类库

    3.2 配置环境变量

    • 系统环境变量下:

      • 新增:
        • 变量名: MAVEN_HOME
        • 值: D:Program FilesMaven_shineapache-maven-3.5.4 (自己Maven的解压目录)
      • 点击path
        • 最后方加上;%MAVEN_HOMEin%
    • 测试

      • 命令行下输入 mvn -v 查看版本信息

    四. Maven配置

    • Maven的conf目录下的setting.xml配置

    4.1 本地仓库

    <localRepository>D:Program FilesMaven
    epository</localRepository>
    <!-- 选择一个磁盘目录, 作为本地仓库 -->
    

    4.2 JDK配置

    • 在标签中 增加一个标签 ,限定Maven项目默认的jdk版本
    <!-- 在已有的profiles标签中添加profile标签 -->
    <profile>
        <id>jdk-1.8</id>
        <activation>
            <activeByDefault>true</activeByDefault>
            <jdk>1.8</jdk>
        </activation>
        <properties>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
            <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
        </properties>
    </profile>
    <!-- 让增加的profile生效 -->
    <activeProfiles>
       	<activeProfile>jdk-1.8</activeProfile>
    </activeProfiles>
    

    五. 仓库

    5.1 概念

    • 存储依赖的地方, 体现形式就是本地的一个目录
    • 仓库中不仅存放依赖, 而且管理着每个依赖的唯一标识(坐标), Java项目凭坐标获取依赖

    5.2 仓库分类

    • Maven仓库
      • 本地仓库
      • 远程仓库
        • 中央仓库
        • 公共仓库
        • 私服

    当需要依赖时, 会从仓库中查找, 优先顺序为

    本地仓库>私服(如果配置了的话)>公共仓库(如果配置了的话)>中央仓库

    5.3 本地仓库

    • 即在settings.xml 中配置的目录
    • 使用过了的依赖都会自动存储在本地仓库中, 后续可以复用

    5.4 远程仓库

    5.4.1 中央仓库
    • Maven的中央仓库是由Maven社区提供的仓库, 不用任何配置, Maven中内置了中央仓库的地址, 其中包含了绝大多数流行的开源Java构件
    • https://mvnrepository.com/ 可以搜索需要的依赖的相关信息(仓库搜索服务)
    • https://repo.maven.apache.org/maven2/ 中央仓库地址
    5.4.2 公共仓库[重点]
    • 除中央仓库之外, 还有其他远程仓库, 比如aliyun仓库(https://maven.aliyun.com/nexus/content/groups/public)
    • 中央仓库在国外, 下载依赖速度过慢, 所以都会配置一个国内的公共仓库代替中央仓库
    • 在setting.xml中添加以下配置
    <!-- 在mirror标签下添加mirror标签 -->
    <mirror>
        <id>aliyun</id>
        <!-- 中心仓库的mirror 镜像 -->
        <mirrorOf>central</mirrorOf>
        <name>Nexus aliyun</name>
        <!-- aliyun仓库地址 以后所有要指向中心仓库的请求 都会指向aliyun仓库 -->
        <url>https://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
    
    • 或者可以配置华为镜像, 配置如下:
    <mirror>
        <id>huaweicloud</id><!-- 镜像id -->
        <!-- 设置镜像匹配的仓库 -->
        <mirrorOf>Central</mirrorOf>
        <name>Nexus huaweicloud</name>
        <!-- 华为仓库地址 以后所有要指向中心仓库的请求 都会指向华为仓库 -->
        <url>https://mirrors.huaweicloud.com/repository/maven/</url>
    </mirror>
    
    5.4.3 私服[了解]
    • 公司范围内共享的仓库, 不对外开放
    • 可以通过Nexus来创建, 管理一个私服

    六. IDEA-Maven

    6.1 在IDEA中关联Maven

    • 在IDEA中关联本地安装的Maven, 后续就可以通过IDEA使用Maven, 管理项目了
    • settings for new projects-->Build, Execution, Deployment-->Build Tools-->Maven
      • Maven home directory
        • Maven的安装路径
      • User settings file
        • Maven的配置文件settings.xml路径, 在Maven的conf目录下
      • Local repository
        • Maven的本地仓库路径

    • 因为现在阿里云不支持http访问, 支持https, 所以有SSL证书验证的问题

    • [重要]所以还需要在IDEA中添加一个配置

    • 在Maven下的Importing的VM options for importer下导入

      • -Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true

    6.2 创建Maven项目

    6.2.1 新建项目
    1. 新建项目, 选择Maven
    2. 确认自己的JDK是否已经选上
    3. 点击Next
    6.2.2 项目位置
    • Name: 项目名称
    • Location: 项目保存位置
    6.2.3 指定项目名
    • GroupId: 项目标识,通常是公司域, 例: com.baidu
    • ArtifactId: 项目名称
    • Version: 项目版本号, 默认为1.0-SNAPSHOT
    6.2.4 项目结构
    • src/main/java 存放源代码, 建包, 放项目中的代码(service, dao, servlet...)
    • src/main/resources 书写配置文件, 项目中的配置文件(jdbc.properties)
    • src/test/java 书写测试代码, 项目中测试案例代码
    • src/test/resources 书写测试案例相关配置文件
    • 根目录/pom.xml(project object model) Maven项目核心文件, 其中定义项目构建方式, 声明依赖等
    • 注意: 项目中的建包, 建类, 执行, 都和普通项目无差异
    6.2.5 项目类型
    • 根据项目类型, 在pom.xml中做出对应配置, 添加配置: war或者jar
    <?xml version="1.0" encoding="UTF-8"?>
    <!--pom: project object model-->
    <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.dz</groupId>
        <artifactId>MavenProject</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <!--打包方式 如果是java项目则用jar
                    如果是web项目则用war-->
        <!--<packaging>jar</packaging>-->
        <packaging>war</packaging>
    </project>
    
    6.2.6 设置编译编码格式
    <properties>
        <!--编译编码-->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    

    6.3 导入依赖jar

    • 创建好项目后, 需要导入需要的jar, 要通过坐标
      • 每个构件都有自己的坐标, GroupId + ArtifactId + Version = 项目标识 + 项目名 + 版本号
      • 在Maven项目中只需要配置坐标, Maven便会自动加载对应依赖, 删除坐标则会自动移除依赖
    6.3.1 查找依赖
    6.3.2 导入依赖
    • 在项目的pom.xml文件中, 增加依赖
    	<packaging>war</packaging>
        <properties>
            <!--编译编码-->
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
    
        <!--定义项目中需要的所有依赖-->
        <dependencies>
            <!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
            <dependency>
                <!--jstl支持-->
                <groupId>javax.servlet</groupId>
                <artifactId>jstl</artifactId>
                <version>1.2</version>
            </dependency>
        </dependencies>
    
    6.3.3 同步依赖
    • 引入坐标后, 同步依赖, 确认导入
    • 在我们引入坐标后, IDEA通常会自动弹出导入依赖的选项, 我们点击即可 或者在IDEA的最右侧边框处有Maven, 在此处刷新

    6.4 创建web项目

    6.4.1 打包方式
    • pom.xml中设置war
    <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.dz</groupId>
        <artifactId>MavenProject</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <!--打包方式 如果是java项目则用jar
                    如果是web项目则用war-->
        <!--<packaging>jar</packaging>-->
        <packaging>war</packaging>
    </project>
    
    6.4.2 web依赖
    • 导入servlet 和 JSP 和 JSTL依赖, 使项目具有web编译环境
    <?xml version="1.0" encoding="UTF-8"?>
    <!--pom: project object model-->
    <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.dz</groupId>
        <artifactId>MavenProject</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <!--打包方式 如果是java项目则用jar
                    如果是web项目则用war-->
        <!--<packaging>jar</packaging>-->
        <packaging>war</packaging>
        <properties>
            <!--编译编码-->
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
    
        <!--定义项目中需要的所有依赖-->
        <dependencies>
            <!--web 项目的编译环境-->
            <!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
            <dependency>
                <!--jstl支持-->
                <groupId>javax.servlet</groupId>
                <artifactId>jstl</artifactId>
                <version>1.2</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
            <dependency>
                <!--servlet编译环境-->
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>3.1.0</version>
                <scope>provided</scope>
            </dependency>
            <!-- https://mvnrepository.com/artifact/javax.servlet/jsp-api -->
            <dependency>
                <!--jsp编译环境-->
                <groupId>javax.servlet</groupId>
                <artifactId>jsp-api</artifactId>
                <version>2.0</version>
                <scope>provided</scope>
            </dependency>
            <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        </dependencies>
    </project>
    
    6.4.3 webapp目录
    • 按照Maven规范, 在main目录下新建web项目的特有目录 webapp
    • webapp目录下新建WEB-INF目录
    • WEB-INF目录下新建web.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
             version="3.1">
    </web-app>
    
    6.4.4 定义Servlet和JSP
    • main-->java-->com.dz-->servlet下新建TestServlet
    package com.dz.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    @WebServlet(name = "TestServlet", value = "/test")
    public class TestServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("Test Servlet!");
            request.getRequestDispatcher("/index.jsp").forward(request,response);
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doPost(request,response);
        }
    }
    
    • webapp目录下新建index.jsp
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <span style="color: red">Hello World!</span>
    </body>
    </html>
    
    

    6.5 部署web项目

    6.5.1 新增Tomcat
    1. 点击Edit Configuration(运行图标的左侧)
    2. 点击+, 找到Tomcat Server下的Local
    3. 点击OK
    4. 在Server下自定义Tomcat名称 Name:
    5. 点击configure, 选择Tomcat的安装目录
    6. 点击OK即可
    6.5.2 部署web项目
    1. 还是点击Edit Configuration(运行图标的左侧)
    2. 然后找到Deployment并点击
    3. 在右侧点击+, 选择Artifact, 然后选项目名:war exploded, 这表示我们把此项目成功部署到了Tomcat下
    4. Deployment下的Application context是项目默认访问路径; 可以自定义, 建议和项目同名, 比如: /MavenProject, 或者为了访问简单, 可以直接设置: /
    5. 最后点击OK即可
    6.5.3 启动Tomcat
    • 方法一: 点击IDEA上方的运行图标
    • 方法二: 在IDEA最下一行找到Services, 点开后在此处运行Tomcat
    • 最后等待弹出浏览器框: 路径: localhost:8080/MavenProject/, 这个默认是自动跳转到webapp下index.jsp中, 我们在网址后方加上test, 就访问到我们创建的TestServlet了

    6.6 依赖生命周期

    6.6.1 概念
    • Jar包生效的时间段, 即Jar的生命周期
    6.6.2 使用方式
    • 项目中导入的依赖可以做生命周期的管理
    <dependencies>
        <dependency>
            <!--jstl支持-->
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <!--servlet编译环境-->
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <!--生命周期-->
            <scope>provided</scope>
        </dependency>
        <dependency>
            <!--jsp编译环境-->
            <groupId>javax.servlet</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.0</version>
            <!--生命周期-->
            <scope>provided</scope>
        </dependency>
    </dependencies>
    
    6.6.3 生命周期详解
    • compile
      • 缺省值, 适用于所有阶段(测试运行, 编译, 运行, 打包)
    • provided
      • 类似compile, 期望JDK, 容器或使用者会提供这个依赖, 如servlet-api.jar; 适用于(测试运行, 编译)阶段
    • runtime
      • 只在运行时使用, 如MySQL的驱动jar, 适用于(运行, 测试运行)阶段
    • test
      • 只在测试时使用, 适用于(编译, 测试运行)阶段, 如junit.jar
    • system
      • Maven不会在仓库中查找对应依赖, 而在本地磁盘目录中查找; 适用于(编译, 测试运行, 运行)阶段

    七. Maven指令

    7.1 命令行

    • 通过IDEA打开命令行, 然后执行Maven命令
    • 也就是在Terminal中执行Maven命令, 例如输入:
      • mvn -v 查看Maven版本号
      • mvn clean 清除上次编译的结果(target)

    7.2 Maven面板

    • IDEA中有Maven面板(IDEA最右侧边框上), 其中可以快速执行Maven指令
    • 双击即可快速执行
    • maven常用命令:
      • mvn clean 清空产生的项目( target)
      • mvn compile 编译源代码
      • mvn package 打包, 默认打包jar包, 如果配置了war则打包war包
      • mvn install 在本地repository中安装jar(包含mvn compile,mvn package,然后上传到本地仓库)
      • mvn deploy 上传到私服(包含mvn install,然后,上传到私服)
      • mvn test 运行测试
      • mvn site 产生site
      • mvn test-compile 编译测试代码
      • mvn -Dtest package 只打包不测试
      • mvn jar:jar 只打jar包
      • mvn test -skipping compile -skipping test-compile 只测试而不编译,也不测试编译
      • mvn source.jar 源码打包

    八. 私服

    8.1 概念

    • 私服是架设在局域网的一种特殊的远程仓库, 目的是代理远程仓库及部署第三方构件
    • 有了私服后, 当Maven需要下载依赖时, 直接请求私服, 私服上存在则下载到本地仓库; 否则, 私服请求外部的远程仓库, 将构件下载到私服, 再提供给本地仓库下载
    • 私服可以解决在企业做开发时每次需要的jar包都要在中心仓库下载, 且每次下载完只能被自己使用, 而不能被其他开发者使用的问题
    • 所谓私服就是一个服务器, 但是不是本地层面的, 是公司层面的, 公司中所有的开发人员都在使用同一个私服

    8.2 架构

    • 无私服时
      • 本地仓库-->远程仓库
    • 有私服时
      • 本地仓库-->私服-->远程仓库
    • 我们可以使用专门的Maven仓库管理软件来搭建私服, 比如:Apache Archiva, Artifactory, Sonatype Nexus, 这里我们使用Sonatype Nexus

    8.3 Nexus安装[了解]

    8.3.1 下载
    8.3.2 安装
    • 下载nexus-2.x-bundle.zip, 解压即可

    8.4 启动[了解]

    • 解压后在bin目录中执行(或者直接为Nexus配置环境变量, 和Maven同理):(以管理员身份运行cmd)
      • nexus install 在系统中安装nexus 服务
      • nexus uninstall 卸载nexus 服务
      • nexus start 启动服务
      • nexus stop 停止服务

    8.5 Nexus 登陆[了解]

    8.6 仓库列表[了解]

    • 仓库类型
      • group: 包含多个仓库, 通过group库的地址可以从包含的多个仓库中查找构件
      • hosted: 私服服务器本地的仓库, 其中存储诸多构件
      • proxy: 代理仓库, 其会关联一个远程仓库, 比如中央仓库, aliyun仓库, 向该仓库查找构件时, 如果没有会从其关联的仓库中下载
    • 仓库名
      • Releases: 存放项目的稳定发布版本, 一个模块做完后如果需要共享给他人, 可以上传到私服的该库
      • Snapshots: 对应不稳定的发布版本
      • 3rd party: 存放中央仓库没有的, 如ojdbc.jar, 可以上传到私服的该库中

    8.7 Maven中配置私服[重点]

    • 在Maven中配置私服, 使得Maven可以从私服上获取构件
    8.7.1 仓库组
    • 而此时就有问题, 私服中有很多仓库, 每个仓库都有自己的url, 那么项目中配置哪个仓库呢?
    • 私服中有一个仓库组, 组中包含多个仓库, 可以指定仓库组的url, 即可以从多个仓库中获取构件
    • 点击仓库central-->Configuration-->Remote Storage Location
      • 把此路径换成华为云的: https://mirrors.huaweicloud.com/repository/maven/ 国内镜像下载速度很快, 也可换成阿里的, 都很快
      • 然后把Download Remote Indexes设置为True, 这是下载远程索引, 为了以后更好更方便的使用依赖
    • 点击仓库Public Repositories-->Configuration
      • 将3rd party从左侧的Ordered Group Repositories移到右侧的Avaliable Repositories(通过点击右箭头的方式)
      • 左侧的Ordered Group Repositories重新排序, Central排到第一位(鼠标拖拽), 此顺序代表提供依赖的仓库优先级, 现在的Central(已关联华为云)第一优先提供依赖
    8.7.2 Maven关联私服
    • 配置setting.xml, 设置私服地址, 认证等信息
    • 复制时不要复制两头的大标签, 例如< servers>< /servers>, 只需把其内容复制到对应大标签下
    <servers>
        <!-- 设置私库认证信息(访问) -->
        <server>
            <id>nexus-public</id>
            <username>admin</username>
            <password>admin123</password>
        </server>
    </servers>
    
    <mirrors>
        <mirror>
            <!-- 设置代理镜像 -->
            <id>huaweicloud</id>
            <!-- 为Central中央仓库设置华为云镜像 -->
            <mirrorOf>Central</mirrorOf>
            <name>Nexus huaweicloud</name>
            <!-- 华为仓库地址 以后所有要指向中心仓库的请求 都会指向华为仓库 -->
            <url>https://mirrors.huaweicloud.com/repository/maven/</url>
        </mirror>
    </mirrors>
    
    <profiles>
      <!-- 设置私服地址(仓库组) --> 
      <profile>
        <id>nexus</id>
        <repositories>
            <repository>
                <!-- nexus的认证id -->
                <id>nexus-public</id> 
                <!-- name随便 --> 
                <name>Naxus Release Snapshot Repository</name>
                <!-- nexus中仓库组对应的地址 --> 
                <url>http://localhost:8081/nexus/content/groups/public/</url>
                <releases><enabled>true</enabled></releases>
                <snapshots><enabled>true</enabled></snapshots>
            </repository>
        </repositories>
        <!-- 插件仓库地址, 各节点的含义和上面是一样的 --> 
        <pluginRepositories>
            <pluginRepository>
                <!-- nexus的认证id -->  
                <id>nexus-public</id>
                <!-- nexus中仓库组对应的地址 --> 
                <url>http://localhost:8081/nexus/content/groups/public/</url>
                <releases><enabled>true</enabled></releases>
                <snapshots><enabled>true</enabled></snapshots>
            </pluginRepository>
        </pluginRepositories>
      <profile>
    </profiles>
    
    <!-- 激活nexus --> 
    <activeProfiles>
      <activeProfile>nexus</activeProfile>
    </activeProfiles>
    
    • 至此, Maven项目需要依赖时, Maven会从私服中下载

    8.8 Maven项目部署到私服

    • 执行: mvn deploy 即可将项目部署到私服对应的仓库中, 此时项目中的打包方式多为jar
    • 但需要提前在项目的pom.xml中配置部署私服仓库位置, 如下
    <!-- 在项目的pom.xml中 配置私服的仓库地址, 可以将项目打jar包部署到私服-->
    <distributionManagement>
        <snapshotRepository>
            <id>nexus-public</id><!-- nexus的认证id -->
            <name>User Project Snapshot</name>
            <!-- Snapshots仓库地址-->
            <url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
            <uniqueVersion>true</uniqueVersion>
        </snapshotRepository>
        <repository>
            <id>nexus-public</id><!-- nexus的认证id -->
            <name>User Project Release</name>
            <!-- Releases仓库地址-->
            <url>http://localhost:8081/nexus/content/repositories/releases/</url>
        </repository>
    </distributionManagement>
    
    • 注意: 如上的id依然要和setting.xml中配置的server中的id保持一致, 才能通过私服的验证
    • 项目部署到Snapshots仓库中还是Releases仓库中取决于我们< version>1.0-SNAPSHOT< /version> 中写的是SNAPSHOT还是RELEASE(或者不写,默认就是这个)
  • 相关阅读:
    前端自动化gulp使用方法
    npm 如何提升最新版本
    AJAX——理解XMLHttpRequest对象
    免插件,简单实现上拉加载loading
    mobiscroll实现二级联动菜单
    js点击页面其他地方如何隐藏div元素菜单
    gulp自动化构建工具使用总结
    如何优雅的选择字体(fontfamily)
    js如何判断用户使用的设备类型及平台
    ant 软件包 javax.servlet.http 不存在 解决办法
  • 原文地址:https://www.cnblogs.com/MRASdoubleZ/p/14720076.html
Copyright © 2011-2022 走看看