zoukankan      html  css  js  c++  java
  • Maven








    写在 plugins 里的
    没有引入依赖包 , 看左侧的依赖树就知道


    打成 jar 包的时候 ( a包 ) , 不会把依赖包也放进来 , 不然就超大
    依赖包的信息在 a包的 pom.xml 文件里


    todo

    解析 用 json 格式写的 maven pom.xml 文件

    在执行任何一个生命周期步骤的时候
    如果发现上一个没有执行
    会自动先执行上一个
    依次递归上去

    比如正常步骤是

    package ( mvn package ) 的时候发现 test 没有执行 , 因为 目录下没有生成 目录
    先执行 test
    test 的时候发现 compile 执行 , 因为 目录下没有生成 目录
    先执行 compile 

    如果想跳过 package 之前的 test , 加上参数 / 跳过test  / 跳过 test
    -Dmaven.test.skip=true -Ptest

    mvn install 命令执行后 提示

    jar 路径 :
    [INFO] Installing E:Mavenpure-maven-plugin argetpure-maven-plugin-1.0-SNAPSHOT.jar to F: epositorypuresamplepluginpure-maven-plugin1.0-SNAPSHOTpure-maven-plugin-1.0-SNAPSHOT.jar

    pom.xml 路径
    [INFO] Installing E:Mavenpure-maven-pluginpom.xml to F: epositorypuresamplepluginpure-maven-plugin1.0-SNAPSHOTpure-maven-plugin-1.0-SNAPSHOT.pom

    因为配置 :

    puresamplepluginpure-maven-plugin1.0-SNAPSHOT 文件夹下的 pure-maven-plugin-1.0-SNAPSHOT.jar 文件
    
    <groupId>pure.sample.plugin</groupId>
    <artifactId>pure-maven-plugin</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>

    IDEA使用Maven命令
    https://www.cnblogs.com/not-alone/articles/7802966.html

    mvn package 自动调用 mvn test
    然后如果发现没有 junit 依赖包 ( 在 pom.xml 里面配置 ) , 就会报错
    换个命令行 : mvn package -Dmaven.test.skip=true -Ptest

    maven 参数的 key value 中间的等号左右不能有空格
    {
    例如不能写
    mvn package -Dmaven.test.skip = true -Ptest
    报错的部一分 : 无法转换 "="
    [WARNING] The requested profile "test" could not be activated because it does not exist.
    [ERROR] Unknown lifecycle phase "="...

    应该写
    mvn package -Dmaven.test.skip=true -Ptest

    结果 :
    [INFO] --- pure-maven-plugin:1.0-SNAPSHOT:sayhi (default) @ my-app ---
    [INFO] Hello, world.
    }

    打开的maven项目不是在根目录 , 而是在更上一级的目录

    创建插件项目的命令行结构 : 删除 ""  , 不要换行 , 替换掉红色的

    To create a new plugin project, you could using the Mojo archetype with the following command line:

    mvn archetype:generate
      -DgroupId=sample.plugin
      -DartifactId=hello-maven-plugin
      -DarchetypeGroupId=org.apache.maven.archetypes
      -DarchetypeArtifactId=maven-archetype-plugin

    举例 :
    想要这样的效果 , 写命令行 :

    <groupId>sample.plugin</groupId>
    <artifactId>hello-maven-plugin</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>maven-plugin</packaging>


    mvn archetype:generate   -DgroupId=sample.plugin   -DartifactId=hello-maven-plugin -DarchetypeGroupId=org.apache.maven.archetypes   -DarchetypeArtifactId=maven-archetype-plugin

    创建项目

    自己写个插件
    {

    一个插件就是一个普通Maven 结构的项目
    用 Maven  编译打包这个插件

    Project Object Model (POM)
    MOJO is a play on POJO (Plain-old-Java-object), substituting "Maven" for "Plain".

    name your plugin <yourplugin>-maven-plugin

    Plugin Development Center
    https://maven.apache.org/plugin-developers/index.html

    Configuring plugins
    https://maven.apache.org/guides/mini/guide-configuring-plugins.html

    插件相关的 api 文档 Mojo API Specification.
    https://maven.apache.org/ref/3.5.3/maven-core/apidocs/org/apache/maven/plugin/PluginParameterExpressionEvaluator.html


    编译 的时候少了一个依赖包

    在idea 里面打包的时候测试依赖一定要有


    编译后安装到本地

    另一个项目引用这个插件 , 配置下在自己的哪个生命周期里执行这个插件


    自己写个后 , 就知道怎么看别人的插件源码了
    因为懂得本质是也是个项目 , 实现了 抽象类 或者 接口 的项目

    }

    A
      B文件夹 ( 标准的 maven 项目 )
      readme.md

    E:MavenAblockchain-part1
    打开的是 A 文件夹



    idea 里面
    双击右侧的 Maven 面板的 compile 按钮 :
    "C:Program FilesJavajdk1.8.0_92injava" -Dmaven.multiModuleProjectDirectory=E:MavenAlockchain-part1 "-Dmaven.home=D:Program FilesJetBrainsIntelliJ IDEA 2017.2.6pluginsmavenlibmaven3" "-Dclassworlds.conf=D:Program FilesJetBrainsIntelliJ IDEA 2017.2.6pluginsmavenlibmaven3inm2.conf" "-javaagent:D:Program FilesJetBrainsIntelliJ IDEA 2017.2.6libidea_rt.jar=51248:D:Program FilesJetBrainsIntelliJ IDEA 2017.2.6in" -Dfile.encoding=UTF-8 -classpath "D:Program FilesJetBrainsIntelliJ IDEA 2017.2.6pluginsmavenlibmaven3ootplexus-classworlds-2.5.2.jar" org.codehaus.classworlds.Launcher -Didea.version=2017.2.6 -s F: epositorysettings.xml -Dmaven.repo.local=F: epository compile

    格式化 :
    "C:Program FilesJavajdk1.8.0_92injava"
    -Dmaven.multiModuleProjectDirectory=E:MavenAlockchain-part1
    "-Dmaven.home=D:Program FilesJetBrainsIntelliJ IDEA 2017.2.6pluginsmavenlibmaven3" 
    "-Dclassworlds.conf=D:Program FilesJetBrainsIntelliJ IDEA 2017.2.6pluginsmavenlibmaven3inm2.conf"
     "-javaagent:D:Program FilesJetBrainsIntelliJ IDEA 2017.2.6libidea_rt.jar=51248:D:Program FilesJetBrainsIntelliJ IDEA 2017.2.6in" 
    -Dfile.encoding=UTF-8 
    -classpath "D:Program FilesJetBrainsIntelliJ IDEA 2017.2.6pluginsmavenlibmaven3ootplexus-classworlds-2.5.2.jar" org.codehaus.classworlds.Launcher 
    -Didea.version=2017.2.6 -s F: epositorysettings.xml 
    -Dmaven.repo.local=F: epository 
    compile

    有的行
    一点引号都不加 -Dfile.encoding=UTF-8  和  -Dmaven.repo.local=F: epository 
    最左边和最右边  "-Dmaven.home=D:Program FilesJetBrainsIntelliJ IDEA 2017.2.6pluginsmavenlibmaven3" 
    只要右边加  -classpath "xxx路径"



    https://issues.apache.org/jira/projects/MNGSITE/issues/MNGSITE-327?filter=allopenissues

    Maven 官方用 jira 来跟踪问题

    搭建仓库的工具和资料
    {
    官方推荐的
    https://maven.apache.org/repository-management.html

    Apache Archiva (open source)
    CloudRepo (commercial)
    Cloudsmith Package (commercial)
    JFrog Artifactory Open Source (open source)
    JFrog Artifactory Pro (commercial)
    Sonatype Nexus OSS (open source)
    Sonatype Nexus Pro (commercial)
    }

    约定大于配置
    几乎都要用到的配置都不许再手动写 , 默认就是这个
    比如
    "是否要打包 资源文件夹 到 jar 或者 war 里 " 这个功能 ,
    默认值是要打包进去 , 万一有需求 , 也可以配置成 不



    Maven 要求的特定的格式

    你会把一个项目普通的项目转换成Maven 结构吗 , 原来管理依赖包很初级 , 自己下载包 ,  然后添加到构建路径
    我不会 , 所以想看看Maven  , 多学一点

    解决方案 :

    右击项目 , 如图
     
    勾选 Maven 结构 , 如图
     

    根据官方文档 实践 + 一点点问题


    手动创建标准的文档结构


     mian:该目录下存放的是该项目的主要代码文件,下面有三个文件夹,分别用来存放:
          Java:该目录用来存放Java的源代码文件
          resources:该目录主要用来存放项目的一些配置文件(比如spring的xml配置文件)。
          webapp:该目录相当于web项目下webcontent的目录,用来存放js、jsp、web.xml等文件.
         
    test:该目录用来存放项目的测试文件
          Java:该目录主要存放该项目的测试所用的Java源代码。
          resources:该目录存放测试使用的资源文件。

    要先配置阿里Maven 镜像源
    官方文档 没先说这个

    官方的 :
    mvn -B archetype:generate
      -DarchetypeGroupId=org.apache.maven.archetypes
      -DgroupId=com.mycompany.app
      -DartifactId=my-app

    要写成一行   Note that these must all be on a single line

    才放到 cmd 里面执行 , 不然这条命令会断开执行 , 异常
    mvn -B archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes  -DgroupId=com.mycompany.app   -DartifactId=my-app


    找不到或无法加载主类


    执行 java ifast-1.0.0.jar 后报错 :
    错误: 找不到或无法加载主类 ifast-1.0.0.jar
    因为命令行中没有加 -jar 参数
    java  -jar ifast-1.0.0.jar

    如果加了后报错 "没有主清单属性" , 查阅相应的解决方案

    maven 打包 java 程序的清单里没有主清单属性


    找不到或无法加载主类

    运行和报错如下 :
    java -jar my-app-1.0-SNAPSHOT.jar
    my-app-1.0-SNAPSHOT.jar中没有主清单属性
    分析 :
    清单缺少个元素来指定 主类 / 入口类

    解决方法 :
    Maven POM文件中添加插件
    然后在 mainClass 元素里配置主类是哪个 , 不需要描述到 main 方法
    copy
    artifactId 为 maven-shade-plugin 的 plugin
    最新版本 3.1.0   , 2018-04-17
    <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/maven-v4_0_0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.mycompany.app</groupId>
      <artifactId>my-app</artifactId>
      <packaging>jar</packaging>
      <version>1.0-SNAPSHOT</version>
      <name>my-app</name>
      <url>http://maven.apache.org</url>
    
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
      </dependencies>
    
    
      <build>
        <plugins>
        
          <!-- 使打包的jar文件包含了主函数的入口 -->
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>1.2.1</version>
            <executions>
              <execution>
                <phase>package</phase>
                <goals>
                  <goal>shade</goal>
                </goals>
                <configuration>
                  <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                      <!-- 主函数所在的包+类 -->
                      <mainClass>com.mycompany.app.App</mainClass>
                    </transformer>
                  </transformers>
                </configuration>
              </execution>
            </executions>
          </plugin>
          
        </plugins>
        
      </build>
    
    </project>
    


    加了插件后 , 打包出两个 jar :  
    my-app-1.0-SNAPSHOT 和 original-my-app-1.0-SNAPSHOT

    E:Mavenmy-app arget 下的 my-app-1.0-SNAPSHOT.jar 里
    完整清单如下 :
    Main-Class 元素描述了 主类的信息
    Manifest-Version: 1.0
    Archiver-Version: Plexus Archiver
    Built-By: pc
    Created-By: Apache Maven 3.3.9
    Build-Jdk: 1.8.0_92
    Main-Class: com.mycompany.app.App

    分别执行这两个 :

    java -jar  my-app-1.0-SNAPSHOT.jar
    Hello World!
    
    java -jar  original-my-app-1.0-SNAPSHOT.jar
    original-my-app-1.0-SNAPSHOT.jar中没有主清单属性



    源码


    https://github.com/apache/maven.git



    官方文档


    https://maven.apache.org/guides/getting-started/index.html

    mvn clean 清理之前生成的
    mvn instal : 会执行 compile , package , test 等
    一般用 mvn clean install 

    IntelliJ IDEA创建 maven多模块 项目
    https://www.cnblogs.com/wangmingshun/p/6383576.html

    第三方资料

    maven 的 pom.xml 文件详解 , 各个元素的手册
    https://www.cnblogs.com/hafiz/p/5360195.html

    pom.xml 里的parent标签,依赖包的配置文件的继承关系


    Maven 依赖包的Snapshot版本和Release版本的区别

    1. Snapshot版本代表不稳定、尚处于开发中的版本 
    2. Release版本则代表稳定的版本 
    以下是相关的知识点:
    3. 什么情况下该用SNAPSHOT? 
         协同开发时,如果A依赖构件B,由于B会更新,B应该使用SNAPSHOT来标识自己。这种做法的必要性可以反证如下: 
          3.1 如果B不用SNAPSHOT,而是每次更新后都使用一个稳定的版本,那版本号就会升得太快,每天一升甚至每个小时一升,这就是对版本号的滥用。 
          3.2 如果B不用SNAPSHOT,但一直使用一个单一的Release版本号,那当B更新后,A可能并不会接受到更新。因为A所使用的repository一般不会频繁更新release版本的缓存(即本地repository),所以B以不换版本号的方式更新后,A在拿B时发现本地已有这个版本,就不会去远程Repository下载最新的B 
    4. 不用Release版本,在所有地方都用SNAPSHOT版本行不行?      
         不行。正式环境中不得使用snapshot版本的库。 比如说,今天你依赖某个snapshot版本的第三方库成功构建了自己的应用,明天再构建时可能就会失败,因为今晚第三方可能已经更新了它的snapshot库。你再次构建时,Maven会去远程repository下载snapshot的最新版本,你构建时用的库就是新的jar文件了,这时正确性就很难保证了。



    IntelliJ 15 配置Maven,右下角最后三行:
    Maven 软件的目录,
    用户自定义的Maven 软件的配置文件,
    地仓库
     

    Tomcat 7 和 9都开不起来,似乎软件没问题,是加载各种包的时候出错,
    分析:
    Maven 本地仓库坏了,清空掉,重新下载一次


    先把镜像配置到Maven 软件的特定格式的配置文件里,H:SoftwareMavensettings.xml
    然后把它跟eclipse 关联一下:

    配置后更新一下项目,
     

    这个URL已经被替换成镜像了,repo2
    原来默认的URL是repo,国外的,很慢
     
    下载并保存到本地的 Maven 仓库
    本地的 Maven 仓库路径默认为  ${user.home}/.m2/repository(可以在setting.xml里添加标签后改掉),例如我电脑上的:
    C:UsersXiaoCong.m2 epository

    所以,commons-io 2.5 包所在的完整的绝对路径:
    C:UsersXiaoCong.m2 epositorycommons-iocommons-io2.5commons-io-2.5.jar

    我自己改了 repository仓库的位置:
    H:SoftwarelibMaven
    E: epository


    问题



    下载插件很慢 / 手动通过浏览器下载,离线安装

    {
    解决方法参考

    实践
    去 maven 仓库搜索想要的插件或者依赖包
    http://mvnrepository.com/artifact/org.apache.maven.plugins/maven-deploy-plugin/2.8.2

    下载 jar 文件, 下载下来的压缩包里的是 .class 文件
    不需要源码的压缩包文件

    下载链接 :

    或者

    放到本地的仓库文件夹里
    E: epositoryorgapachemavenpluginsmaven-deploy-plugin2.8.2
    红色的是仓库的路径
    后面的路径根据压缩包里的路径来 , 没有该文件夹就手动创建

    }



    "有个插件能开启内嵌的 Tomcat  " 是什么意思



    怎么生成标准结构

    手动
    Gradle 可以自动

    生成 test 目录




    本地仓库


    放到 settings 标签下
    注意路径中斜杠的方向

    <!-- 本地仓库的存储位置, Default: ~/.m2/repository-->
        <localRepository>D:MVNRepository</localRepository>

    Maven 国内镜像

    ############################################

       
    
    
    <!-- 写在 settings 下的 profiles 下  -->
        
        <!-- 设定主仓库,按设定顺序进行查找  -->
        <repositories>
    		<repository>
                <id>aliyun</id>
                <name>aliyun Repository</name>
                <url>http://maven.aliyun.com/nexus/content/groups/public</url>
                <snapshots>
    				<enabled>false</enabled>
    			</snapshots>
            </repository>
            
    		<repository>
                <id>jeecg</id>
                <name>jeecg Repository</name>
                <url>http://maven.jeecg.org/nexus/content/repositories/jeecg</url>
                <snapshots>
    				<enabled>false</enabled>
    			</snapshots>
            </repository>
            
            <repository>
                <id>jeecg-snapshots</id>
                <name>jeecg-snapshots Repository</name>
                <url>http://maven.jeecg.org/nexus/content/repositories/snapshots</url>
                <snapshots>
    				<enabled>true</enabled>
    			</snapshots>
            </repository>
            
        </repositories>



          <!-- https://my.oschina.net/fdblog/blog/546938 -->
          
    <!-- aliyun -->

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

    <!-- net-cn -->

    <mirror> 
    <id>net-cn</id> 
    <mirrorOf>central</mirrorOf> 
    <name>Human Readable Name for this Mirror.</name> 
    <url>http://maven.net.cn/content/groups/public/</url>  
    </mirror>

    <!-- UK -->

    <mirror> 
    <id>uk</id> 
    <mirrorOf>central</mirrorOf> 
    <name>Human Readable Name for this Mirror.</name> 
    <url>http://uk.maven.org/maven2/</url> 
    </mirror>

    <!-- ibiblio -->

    <mirror> 
    <id>ibiblio</id> 
    <mirrorOf>central</mirrorOf> 
    <name>Human Readable Name for this Mirror.</name> 
    <url>http://mirrors.ibiblio.org/pub/mirrors/maven2/</url> 
    </mirror>

    <!-- jboss -->

    <mirror> 
    <id>jboss-public-repository-group</id> 
    <mirrorOf>central</mirrorOf> 
    <name>JBoss Public Repository Group</name> 
    <url>http://repository.jboss.org/nexus/content/groups/public</url> 
    </mirror>

            <!-- repo2 -->
     
    <mirror> 
    <id>repo2</id> 
    <mirrorOf>central</mirrorOf> 
    <name>Human Readable Name for this Mirror.</name> 
    <url>http://repo2.maven.org/maven2/</url> 
    </mirror>


    <!-- OSC -->

    <mirror>
    <id>CN</id>
    <name>OSChina Central</name>                                  
    <url>http://maven.oschina.net/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>
    </mirror>




  • 相关阅读:
    数据结构--线性表和链表的基础知识
    OC基础--字符串
    iOS开发知识梳理博文集
    OC基础--数据类型与表达式
    数据结构概述
    数据结构--栈和队列基础知识
    NodeJS Get/Post 参数获取
    NodeJS + express 添加HTTPS支持
    NodeJS 获取系统时间 并格式化输出
    Node.Js + Express 搭建服务器
  • 原文地址:https://www.cnblogs.com/xiaoCong2016/p/6525710.html
Copyright © 2011-2022 走看看