• windows下搭建Nexus3私服和基于IDEA15的Maven学习笔记


    Maven是一款依赖管理框架,可以很方便的管理你的jar包依赖和项目依赖。

    简单来说就是只需要你添加一个jar包的配置,就会自动帮你下载所需要的jar包,而maven中央仓库里面会维护很多jar包在里面,如果你想要的jar包有的话那么就会自动下载下来。

    但是做为一个公司来说,经常会遇到有些jar包并不在中央仓库,或者说项目之间互相依赖,而自己的项目jar包肯定也是只有自己公司用得到。这时候一般就会选择搭建一台Nexus服务器,来管理所有用到的jar包,方便公司内部同志从上面下载,或者把自己的jar包给放上去给别的项目使用。

    本文就是一步步展示如何安装配置一天nexus服务器,并且如何配置maven,让你的maven来从这台服务器上上传和下载jar包。

    搭建Nexus私服。

    首先去官网下载window下用的zip文件。https://www.sonatype.com/download-oss-sonatype

    解压之后包含下面两个文件

    进入nexus下面的bin目录

    在cmd命令下,执行nexus.exe /run,就可以启动成功了。

    另外nexus.vmoptions是nexus的配置文件里面可以修改数据的存储路径。

    我这里把路径修改为nexus-data.

    重启nexus,然后目录下就多出了一个nexus-data文件,并且和之前解压出来的sonatype-work是一样的,可见之前的sonatype-work文件就是用来存储nexus数据的。

    nexus-3.1.0-04etc目录下的nexus-default.properties文件是用来配置。修改IP、端口、访问根目录的。配置成你想要的数据之后

    再启动nexus,然后就可以访问http://127.0.0.1:8091/nexus-console/

    安装成功后默认账户是admin具有全部权限默认密码admin123

    登录之后我们就可以配置我们的仓库。

    其中central库的类型是proxy,里面的URL是maven中央存储库,http://repo1.maven.org/maven2/。

    Public 库的类型是group。这说明public库是一个组,而组里面是可以把你需要的库给配置进去。

     

    而release库和snapshots库,都是host类型的,也就是我们自定义库。其中release库放的是稳定版本的jar,snapshots库是放置快照版本的jar。稍后我们会解释release和snapshots之间的区别。

    下面我们配置一个自己本地库,用来放置一些我们自己第三方jar包,实际上大部分的jar包都是可以在公共库里面找到的,所以我就自己随便找一个jar为例子。

    下面我们先创建一个host类型的库,作为我们本地库。

     

    然后输入你想要的名字就行了,其他的配置基本不需要改变。

     

    配置完成后,列表里面就会把你的那个库给显示出来。

    下面我们尝试向这个第三方库里面上传jar包。我们要把D盘下面的ojdbc-6.jar给上传到我们的maven thirdParty库里面

    Nexus2系列里面是可以在图形用户界面直接上传jar的,但是在nexus3里面,我并没有找到怎么上传,网上也没有,所以我们姑且用命令上传吧。

    首先在你的maven配置文件里面,confsettings.xml里面配置服务器的信息

     

    然后cmd执行如下命令,别直接拷贝因为为了方便阅读我给换行了。Cm窗口下你要写成一行。

    mvn deploy:deploy-file

    -DgroupId=com.test

    -DartifactId=ojdbc

    -Dversion=6

    -Dpackaging=jar

    -Dfile=D:ojdbc-6.jar

    -Durl=http://127.0.0.1:8091/nexus-console/repository/maven-thirdParty/

    -DrepositoryId=nexus

    这里面url一定要注意,ip和端口就不再解释了,nexus-console必须和你在nexus-3.1.0-04etc目录下的nexus-default.properties这个文件里面配置的nexus-context-path对应,repository是固定的,nexus3里面就用这个,而nexus2里面用的是content epositoris,maven-thirdPary是你的库的名字,另外后面的/也是必不可少的。

    上传之后我们就可以在自己nexus私服看到了。

    ---------------------------------------------------------------------

    下面我们开始尝试把刚才上传的那个jar包,做为第三方库给拉下来。

    我用的IDE是IDEA15,里面的maven需要在settting里面配置一下,eclipse相应的也需要配置一下。

    既然我们需要去服务器上把我们的jar包给拉下来,那么肯定是要把jar包对应的路径给maven指示出来。

    这里有两种方式

    第一种是配置在Pom 文件里面,放在project节点下面就好了。

    配置在setting.xml里面,这样的话就使用该maven的所有项目。需要放在profile下面

    为了让着profile有效我们还需要配置。(这个配置,如果你只有一个repository的话,activeProfiles应该是可以不配置的,我测试过,没有这个配置仍然有效。)

    目前这种情况下,如果我们私服上找不到还是回去中央库找的。那我们如何让maven只在本地库找呢?

    这就需要在setting.xml里面配置mirrors,然后再repository里面把id配置为central,这样id为central的配置会覆盖maven的base pom的默认配置。这时候profile配置的url其实已经没有什么意义了,配置仓库和插件仓库的主要目的是,控制release和snapshot版本是否可用。当maven需要下载构件的时候,会先去访问central的配置,查看是否支持下载快照或者是release版本。当得到肯定的回复的时候,就会走mirrors的配置,所以仓库自己的路径其实已经没什么用,配置成什么都可以。

    我们现在尝试下是否能下载下来。

    用IDEA新建一个common的maven项目,就叫common,pom文件添加如下配置。

    然后maven自动就会把该jar包下载到本地。另外需要注意的是,对于maven2,和3,modelVersion都是4.0.0

     

    然后我们可以对common项目打包,默认是打包为jar。

    运行mvn clean package,目的是把代码打包到package。我们可以直接运行在项目目录下运行

    Mvn clean package,这行命令的意思就是把该项目打包,根据pom文件里面的packaging字段的类型来打包,我们先打包成jar(不配置默认就是打包成jar)。

    这样的话,我们的jar包就被打包到target目录下了,而这时候我们的本地库还是没有的,那么假设我们还有别的maven项目要依赖这个jar包,还是找不到的,这时候,我们就需要运行mvn clean install。

    这样的话,我们的本地库就是有这个,那别的项目配置上依赖,就可以引用这个jar包了。找个稍后演示。

    下面我大致解释下,maven命令的生命周期。

    首先大家看下,我执行mvn clean install时候的控制台。

    从截图我们可以看出,maven的命令,其实就是执行某个插件的某个方法,比如

    Clean命令就是执行了clean插件下的clean方法,效果是删除了target目录下所有的文件。

    但是我们明明没有执行过compile命令,为什么也调用到了compile:compile方法呢?这就是跟maven的生命周期有关了。

    生命周期其实是一个抽象出来的概念,我们在一个项目中,经常需要进行,编译,测试,打包,部署,等等一系列的动作。比如有时候我们需要打包,那么我们至少要先进行编译吧,maven就把这些动作抽象为不同的生命周期,在每一个生命周期里面,都定义好了步骤(相当于一个抽象类),而插件就是用来实现具体逻辑的,就是实现这个抽象类。这样就可以方便的通过配置插件来实现构建的行为,甚至可以自己书写插件来实现某些特殊的需求。

    Maven是有3套独立的生命周期的生命周期。

    Clean生命周期的目标是清理项目,包含:

    1 Pre-clean  

    2 Clean  

    3 Post-clean  

    Default 生命周期,是构建的核心阶段,包括

    1. validate
    2. initialize
    3. generate-sources
    4. process-source
    5. generate-resource
    6. process-resource
    7. compile
    8. process-class
    9. generate-test-sources
    10. process-test-sources
    11. generate-test-resources
    12. process-test-resources
    13. test-compile
    14. process-test-classes
    15. test
    16. prepare-package
    17. package
    18. pre-integration-test
    19. integration-test
    20. post-integration-test
    21. verify
    22. install
    23. deploy

        site 生命周期,主要是建立站点和发布的。

    1. pre-site
    2. site
    3. post-site
    4. site-deploy

    这三个生命周期是独立的,互不影响的,而生命周期本身是从上到下的。

    比如,你只执行clean命令,那么实际执行的是pre-clean 和 clean两个动作。

    你执行compile命令,执行的是Default 1~7所有的动作。

    而只执行compile的话,是不会触发clean相关的动作的。

    这也就解释了为什么我们一条命令会有那些动作的原因了。

    下面说下,聚合跟继承。

    首先说聚合,当我们项目中有多个子项目,并且这些子项目又需要同时构建的话,那我们就需要在每一个目录下面执行mvn install命令。

    这样工作就比较重复,我们可以通过聚合来实现只执行一条命令,就同时构建多个项目。

    然后再说继承。

    就和java一样,如果有两个很相似的类,里面又有大量相同的代码,那我们会把相同的部分抽出来成为一个父类一样。Maven也可以有这种结构,这样就可省却大量的配置。

    首先我们新建一个maven项目pom_base,由于这是一个用来被继承的maven项目,所以并不需要有什么代码,只需要一个pom文件

    然后我们在common的pom里面继承parent。注意,packaging一定要是pom类型的

    这时候可以看到,pom是有报错的,报错如下:

    报错原因是,common在本地库并没有找到我们pom_base项目的pom文件。这时候我们有两个解决方案。

    1. 根据报错可以看出来,我们只需要配置<relativePath></ relativePath>标签,指明parent的具体位置就好。
    2. 把pom_base给install到本地库就好。(我们系统就是采用这种方式)。

    我们项目其实很多子项目都继承pom_base.

    另外这里面再解释一个标签,以pom_base为例子。就是定义变量,比如对于spring很多依赖版本是一样的,那么就可以把这些版本抽出来成为一个变量,这样的话,改起来的话只需要改这个变量的值就好了。

     

    然后我们新建第三个项目,springStudy(名字忽略)

    然后依赖common,继承pom_base.

    这样我们就基本模拟了现在的项目结构。

    比如,vst_front会依赖vst_common同时再继承vst_pom_base.

    最后再说一下怎么样发布到我们nexu私服上。为了发布到服务器上,首先要在pom配置

     

    然后在setting.xml配置server信息,因为默认的访问权限是只读的,你是不能发布到到nexus上的,所以要配上管理员权限的server(前文有说过怎么配置)。我们可以把上面的配置在pom_base里面,这样我们的三个项目就都可以放到nexus上了,不需要每个pom都配置一遍。

    为了都尝试下,我comm放的是snapshot版本,springStudy放的是release版本

    然后执行mvn deploy,遗憾的是报错了,没有被授权,这是因为我之前配置server的时候只配置了一个server,id是nexus

    所以我把id改为nexus就好了

    这样就上传上去了

    最后再解释下 snapshot和release的区别。本身就理解的请忽略。

    举个例子,如果A,B两人协作, A开发common,B开发springStudy。A开发完common,如果B需要用A新开发的代码,那么假设,A传到nexus上的版本是1.0,那么就算他的代码改动了B那边也不会把这个新的1.0给下载到本地库的,因为对于B来说他认为新上传的1.0和以前的1.0没区别。这时候为了告诉B两个是不一样的,A需要把pom版本改为2.0然后再deploy,假设频繁修改代码,就需要频繁的改动pom文件。而SPANPSHOT版本可以解决这个问题,这时候A只需要把pom文件里面的版本改为1.0-SNAPSHOT这时候当他deploy到nexus上的时候,jar包后面会自动跟上一个时间戳,如下面的例子一样。这时候B那边就知道它本地库的和nexus上的是不一样的,可以去nexus上把最新的版本更新下来了。

  • 相关阅读:
    雅虎军规34条 (一)
    jetty和tomcat的区别
    Jsp--9大内置对象
    java 重定向和转发的区别
    layer弹出层
    html 锚点
    css绘制三角形
    原生js下拉菜单联动
    layui省市区下拉菜单三级联动
    tp5时间格式转换
  • 原文地址:https://www.cnblogs.com/my-king/p/6405421.html
Copyright © 2020-2023  润新知