Maven

1.Tomcat部署项目的方式

  • 前置信息:1.一个项目中 部署到Tomcat服务器上的内容并不是他的所有内容 而是包含字节码文件、依赖函数库以及网页资源在内的文件才会被部署到Tomcat服务器上 2.在获取项目对应的artifact时 你是可以选择获取解压版(exploded 即暴露的意思)还是压缩版(archive 即压缩的意思)的 3.项目文件压缩为war的操作中 压缩为zip在修改后缀名为war的行为很不严谨 替换的做法是利用idea的project structure中的artifact中的archive 就可以获取项目对应的war包 他会放置在out目录中 4.在project structure中创建项目中的artifact仅仅只是完成相应的配置操作 而是需要我们通过build手段才可以真正将artifact发布到out文件夹中
  • 方式一:将web项目拷贝到%TOMCAT_HOME%/webapps目录中 项目名称就是ContextPath
  • 方式二:将web项目压缩为war 然后将其拷贝到%TOMCAT_HOME%/webapps目录中 war名称就是ContextPath 启动Tomcat的过程中就会自动将war解压为普通文件夹(注意:压缩的对象并不是web项目 而是web项目下的内容)
  • 方式三:在%TOMCAT_HOME%/conf/server.xml文件夹中的Host标签的最后编写Context标签 格式要求为<Context docBase=“项目路径” path=“ContextPath” /> Application Context就是ContextPath
  • 方式四:在%TOMCAT_HOME%/conf/Catalina/localhost目录中创建一个xml文件 里面编写Context标签 格式要求为<Context docBase=“项目路径” /> path是可选的 因为path默认就是xml文件名称
  • 方法一、方法二这两种方法的弊端在于一旦项目的体积很大的话 那么拷贝的时间就要求很长
  • 方法三、方法四这两种方法的弊端在于一旦你的项目删除的同时配置信息没有删除的话 那么你的Tomcat启动就会出现问题
  • idea中Tomcat部署项目的方式就是上述四种中的第四种方式 但是我们可能会觉得奇怪 为什么部署以后 在Catalina/localhost目录中并没有新建一个xml文件 这是idea避免tomcat遭受污染的所采取的行为 他会另行新建一个文件夹用于存放xml文件 也能够达到同样的效果 该文件夹就是CATALINA_BASE

2.传统开发中的常见痛点

  • jar包的下载(体现在我们需要手动下载)、升级(体现在需要部分jar包替代)、依赖(一个jar包有可能依赖于其他若干个jar包)、冲突(不同的jar包有可能依赖于相同但不同版本的jar包 这就会引发冲突)
  • 不同IDE之间的项目共享会出现问题(比如Java的开发工具:Eclipse、Idea 两者的项目结构不同 项目共享指定会引发问题)
  • 单元测试(每一个类对应一个测试类 以传统项目的视角 一键测试这些测试类的话 是不可行的)
  • 打包发布的过程过于繁琐

3.传统项目 vs Maven项目

假设存在多个项目的话 并且多个项目中所依赖的jar包都是相同的 那么从川传统的角度来看 硬盘中就会存在多个相同的jar包
同样的条件下 如果是Maven项目的话 那么他就会将jar包抽取为单独的文件 由多个项目去引用依赖 这样的好处在于减小体积 并且我们在进行项目共享的时候 共享的是除开jar包的项目 到时候会根据依赖关系自动下载所依赖的jar包

4.Maven

Maven主要用于自动化创建和管理Java项目

  • 基于项目对象模型(POM 即Project Object Model)的概念
  • 必须配置好JAVA_HOME 因为Maven是由Java编写的 Maven对Java版本的要求请参考对应版本
  • 建议设置MAVEN_HOME 并且将MAVEN_HOME中的bin目录添加到path中
  • 环境变量配置完毕以后 我们可以到cmd窗口中进行检测 输入mvn -v 如果出现版本号的话 证明配置完毕
  • 修改Maven项目的JDK版本
    • 在pom.xml中为properties标签添加属性
    <properties> 
    	<maven.compiler.source>8</maven.compiler.source> 
    	<maven.compiler.target>8</maven.compiler.target> 
    	<maven.compiler.compilerVersion>8</maven.compiler.compilerVersion>
    </properties>
    
  • Maven项目的常见目录
    • Maven采用的是约定优于配置的思想(比如不同IDE中的文件结构有所不同 采用Maven提供的默认文件结构即可于IDE无关)
    • 创建Maven项目时 会自动创建Maven内置的默认文件结构 开发人员只要在相应的位置放置相应的文件即可(其中 war主要指的是打包以后的war文件 web项目资源则一般指的是idea中web目录下的资源 pom.xml为项目的描述文件 主要描述项目相关的版本、编码方式等信息)
      在这里插入图片描述
    • Maven项目的创建(建议通过cmd窗口自动创建)
      • 具体指令为mvn archetype:generate
      • 指令执行以后 他会从远程的中央仓库下载一些信息到本地仓库中 默认的本地仓库存放在C盘中 最好不要放在C盘中 我们可以通过MAVEN_HOME/conf/setting.xml修改默认的本地仓库存放位置(设置localrepository标签)
      • 由于服务器位于国外 所以下载速度可能被限制了 为了提高下载速度 我们可以使用国内阿里巴巴提供的镜像服务器进行下载
      • 如果我们利用maven创建的是Java项目的话 一般选择默认的7(quickstart)即可
      • groupid和package设置为包名 即域名的倒置 比如:com.axihh.maven
      • artifactid是项目名称 自行定义
      • 版本号按照默认值即可
      • 通过调整cmd窗口的路径来改变所创项目存放的位置
  • maven指令简介
    • mvn compile 编译源文件
    • mvn test 一键测试所有的测试字节码 由于测试字节码依赖于源文件字节码 所以说两个字节码都会产生
    • mvn clean 删除target目录
    • mvn package 将源文件字节码进行打包
  • idea导入maven
    • idea中其实内置了默认的maven 和我们之前的下载好的maven起冲突 因此 我们得手动设置maven 避免重新从中央仓库中传输信息导致效率降低
    • file->new->module from existing sources->导入xml文件(可以省略弱干个下一步)
    • 导入完毕以后 右侧栏会出现maven的字眼 点击 可以发现一些相关的maven指令
    • 我们可以直接双击右侧边栏的maven指令 也可以点击右侧边栏中的m字眼 输入相关的maven指令 也可以在terminal(终端)中输入相关的maven指令 完成你的预期
  • idea创建maven
    • 直接通过file->new->module->maven即可创建一个maven文件
    • 一般我们按照默认的quickstart(7)创建文件即可
    • 同样也需要设置一下groupid、artifactid、version这些参数 而且你可以指定你的maven项目的存放路径为之前你所创建的JavaEE项目的目录
    • 由于idea在maven的基础上做出自己的一些调整 对xml文件进行一些修改 所以说修改势必需要重新下载一些内容 这是十分正常的
    • 但是idea在xml中自添加的内容、在文件结构中java/test中子添加的java类对于我们是一种负担 为了消除这些负担 我们应该在创建maven项目的时候不勾选create from archetype选项 这样 我们的文件结构以及描述文件才会相对简洁
  • 项目类型的选择
    • 以前 我们键入mvn archetype:generate的指令以后会出现项目类型选择的界面 我们通常会选择7 这其实是在创建一个普通的Java项目 那么如果我们想要创建一个web项目的话 其实选择的就是选项10
    • 一旦我们创建了web项目 那么我们可以发现 他并没有提供main/java文件夹或者test文件夹 因为在web中 这些都是可选的(一个web项目可以都由jsp组成 而不需要servlet)
  • 一行指令创建maven项目
    • 之前我们通过maven指令创建项目之后 还需要在窗口中设置一系列参数 才能最终创建项目 但是现在 参数的选择可以直接体现在指令中
    • 具体的指令就是mvn archetype:generate -DgroupId=com.axihh -DartifactId=01_test -Dversion=1.0-RELEASE -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp
  • pom.xml
    • pom是maven项目的核心配置文件 他的根元素为project 而project的常用子元素如下所示
      在这里插入图片描述
    • groupId、artifactId、version三个元素构成了maven坐标 而maven坐标确定了唯一的maven项目
  • 运行测试代码
    • 要测试代码 需要依赖junit包 我们在pom配置文件中内置properties属性 properties元素具体的子元素包含:groupId、artifactId、version(三者确定了唯一的一个maven项目)
    • 如果想要知道指定jar包的三个参数(groupId、artifactId、version)的话 那么建议去这两个网站寻找 网站1 网站2
    • 他优先会去本地仓库中寻找是否存在指定的依赖jar包 如果没有的话 他会提示你下载 你可以通过reimport操作重新加载pom.xml
      在这里插入图片描述
    • 可能出现的一些警告
      • 文件编码的问题:你可以在properties元素中内置project.build.sourceEncoding元素来设置文件的编码 <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties>
      • JDK版本过低的问题:你可以在properties元素中根据提示设置JDK版本 <properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>14</maven.compiler.target><maven.compiler.compilerVersion>8</maven.compiler.compilerVersion></properties>
  • runnable jar(可运行jar包)
    • jar包可分为两类:1.普通jar包(常见的就是提供多个功能的依赖jar包) 2.可运行jar包(内置了程序的入口 以便运行)(可以使用java -jar jar包路径指令运行runnable jar)
    • 对于普通的Java项目 打包为可运行jar包的步骤为
      在这里插入图片描述
      在这里插入图片描述
    • 对于maven项目而言 我们肯定不能使用传统的打包方式 他提供了package指令(默认打包的结果就是jar)我们得好好的利用 但是这个指令获取的jar包并没有指定哪一个main方法作为程序的入口(一个项目可能存在多个main方法) 有很多方式使得package指令执行以后的jar包变成可运行的jar包
  • 方法一(maven-jar-plugin)
    • 这种方式并不会将依赖包放入最终生成的可运行jar包中 而是会将依赖包放置在target/lib
    • 第一个plugin带有mainClass属性可以解决未指明程序入口的问题
    • 第一个plugin中添加addClasspath、classpathPrefix属性并且添加第二个plugin属性可以解决依赖包API调用失败的问题
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.0.2</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib</classpathPrefix>
                        <mainClass>com.axihh.Main</mainClass>
                    </manifest>
                </archive>
                <finalName>test1</finalName>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>3.1.2</version>
            <executions>
                <execution>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/lib</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
  • 方法二
    • 该方法可以将依赖包装载进最终生成的jar包
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.3.0</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>com.axihh.Main</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <finalName>test1</finalName>
                <appendAssemblyId>false</appendAssemblyId>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
  • 方法三(maven-shade-plugin)
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.2.3</version>
            <executions>
                <execution>
                	<!-- <phase>package</phase> -->
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <shadeArtifactAttached>true</shadeArtifactAttached>
                        <transformers>
                            <transform implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>com.axihh.Main</mainClass>
                            </transform>
                        </transformers>
                        <finalName>test1</finalName>
                        <appendAssemblyId>false</appendAssemblyId>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
  • 方法四(spring-boot-maven-plugin)
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.3.0.RELEASE</version>
            <executions>
                <execution>
                	<!-- <phase>package</phase> -->
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                    <configuration>
                        <mainClass>com.axihh.Main</mainClass>
                        <finalName>javahaha</finalName>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

5.一些操作

  • 如果你想要彻底清楚所依赖的jar包 除了说直接将lib文件夹中的jar包清空以外 还得检查一下project structure/module/dependencies中所依赖的jar包有无清除
    • 现在引入了maven 传统的使用lib储存jar包的做法就不推荐了 maven正是为了优化传统开发中的一些做法 我们可以通过在pom中内置properties属性来设置依赖的jar包(依赖jar包的具体体现在于external libraries目录中)
  • 如果你想要批量修改标识符的话 默认的快捷键为shift+f6 但是你也可以自行设置批量修改标识符的快捷键 我这边设置为alt+r(rename)
  • 如果想要一个窗口中展示多个项目的话 那么你的做法是先创建一个空项目 作为储存多个项目的大文件 接着在其中以子模块的形式存放项目
  • Unable to import maven project: See logs for details如果出现了这样的警告 那么很有可能是你的maven版本和idea版本不兼容导致的 像我就是下载一个更低版本的maven来解决问题
  • load maven changes是idea2020才推出的功能 他可以加载当前未依赖的jar包 和reimport all maven projects这种重新加载所有依赖的jar包是有所不同的
  • 如果你想要将当前项目中关于maven的配置作用在所有的项目 你就得按照如下步骤进行操作
    在这里插入图片描述
    在这里插入图片描述
  • pom.xml依赖jar包是通过内置dependencies元素实现的 他的寻找思路是:优先到本地仓库中寻找指定jar包 如果本地仓库没有 就会去中央仓库寻找 如果中央仓库有的话 就会先下载到本地仓库 然后依赖于它 如果中央仓库没有的话 那就证明指定jar包的作者并没有将其上传到中央仓库
    • 解决方法:将指定jar包直接放置在本地仓库中 可以通过指令完成相关操作mvn install:install-file -Dfile=jar的路径 -DgroupId=组织 -DartifactId=库名 -Dversion=版本 -Dpackaging=jar
  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

axihaihai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值