0.前言

在日常开发过程中,我们会遇到部分jar包属于公司内部使用不能外传,部分jar包属于其它公司提供,但是他们也不希望发布到中央仓库,这可造成了一定的混乱。虽然这些包可以本地安装。但是有条件的公司一般在内网自己搭建maven 私有服务器,同时,阿里云用户可以在云效中使用自己搭建的私有Maven仓库。当我们有了一个私有服务器了,我们的打法就不同了。下面我就私有服务器作用的两部分来聊它们需要的配置。

1.作为镜像(伸手党)

一般说来,公司的私服也是定时拉取其它国内私服镜像,比如阿里云镜像。所以我们在配置的时候应该让中央仓库被我们的私服所代理。额外所需要jar包在项目的pom文件中配置。故在settings.xml文件中只应添加:

<mirrors>
    <mirror>
      <id>nexus3</id>
      <name>nexus3</name>
      <url>http://192.168.8.8:8888/repository/maven-public/</url>
      <mirrorOf>central</mirrorOf>
    </mirror>
  </mirrors>

其中的192.168.8.8:8888是maven仓库的地址,每个公司都不一样的,如果不是自己搭建的,可以询问组内其他人员或组长。那么我们必然需要公司内部的jar包嘛,所以我们就要在自己的项目的pom文件中添加对应的仓库,假设我们需要一些快照jar包,我们就可以配置:

<repositories>
        <repository>
            <id>nexus3-snapshots</id>
            <name>nexus3-snapshots</name>
            <url>http://192.168.8.8:8888/repository/maven-snapshots/</url>
        </repository>
    </repositories>

别的公司给我们的jar包,我们也可以在Nexus Repository中手动上传。然后在特定项目中配置<repository>就可以了:

如何搭建公司内部maven仓库_jar

2.发布jar包(造物主)

2.1. 发布jar包的钥匙

由于我们要发布到公司内部的maven私服,就要对它进行保护。不能谁都能进行jar包发布,有一些人恶搞一些没用的jar包往里塞也允许,服务器就混乱了。我们也需要知道是谁发布了jar包,故我们最好是给每个程序员建立账号和密码。对于开启发布大门的钥匙,我们需要添加配置:

<servers>
    <server>
      <id>maven-releases</id>
      <username>henry</username>
      <password>henryPassword</password>
    </server>
    <server>
      <id>maven-snapshots</id>
      <username>henry</username>
      <password>henryPassword</password>
    </server>
    <server>
      <id>3rd_part</id>
      <username>henry</username>
      <password>henryPassword</password>
    </server>
  </servers>

2.2. 管理可以发布的类型(发布门槛)

我们知道,我们的jar包是有快照和正式两种版本类型。快照的jar包可能会因为同事的催促发布到私有服务器上,但是又没有一个长期存在的价值。且查找某个版本时异常复杂因为匆忙发布往往忘记修改快照版本。此时就需要区分快照和稳定版本发布的配置。故我们需要在settings中配置:

<profiles>
    <profile>
      <id>nexus3</id>
      <repositories>
        <repository>
          <id>maven-public</id>
          <url>http://192.168.8.8:8888/repository/maven-public/</url>
          <releases>
            <enabled>false</enabled>
          </releases>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </repository>
        <repository>
          <id>maven-releases</id>
          <url>http://192.168.8.8:8888/repository/maven-releases/</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </repository>
        <repository>
          <id>maven-snapshots</id>
          <url>http://192.168.8.8:8888/repository/maven-snapshots/</url>
          <releases>
            <enabled>false</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
          </snapshots>
        </repository>
        <repository>
          <id>3rd_part</id>
          <url>http://192.168.8.8:8888/repository/3rd_part/</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </repository>
      </repositories>

      <pluginRepositories>
        <pluginRepository>
          <id>maven-public</id>
          <url>http://192.168.8.8:8888/repository/maven-public/</url>
          <releases>
            <enabled>false</enabled>
          </releases>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </pluginRepository>
      </pluginRepositories>
    </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>
  </profiles>

最后不要忘了激活这个profile,激活了之后,在所有的maven build中都会应用它们的,防止自己出错。

<activeProfiles>
    <activeProfile>nexus3</activeProfile>
  </activeProfiles>

2.3.汇总

故对于发布一个jar包,你需要在settings.xml中配置:

<!-- 下面配置认证的信息,每当maven需要连接到一个服务器时需要认证信息了,都会在这里查一下。 -->
<servers>
    <server>
      <id>maven-releases</id>
      <username>henry</username>
      <password>henryPassword</password>
    </server>
    <server>
      <id>maven-snapshots</id>
      <username>henry</username>
      <password>henryPassword</password>
    </server>
    <server>
      <id>3rd_part</id>
      <username>henry</username>
      <password>henryPassword</password>
    </server>
  </servers>

<!--  如下的配置一些maven 在build过程中的定制化的内容-->
<profiles>
    <profile>
      <id>nexus3</id>
      <repositories>
        <repository>
          <id>maven-public</id>
          <url>http://192.168.8.8:8888/repository/maven-public/</url>
          <releases>
            <enabled>false</enabled>
          </releases>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </repository>
        <repository>
          <id>maven-releases</id>
          <url>http://192.168.8.8:8888/repository/maven-releases/</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </repository>
        <repository>
          <id>maven-snapshots</id>
          <url>http://192.168.8.8:8888/repository/maven-snapshots/</url>
          <releases>
            <enabled>false</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
          </snapshots>
        </repository>
        <repository>
          <id>3rd_part</id>
          <url>http://192.168.8.8:8888/repository/3rd_part/</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </repository>
      </repositories>

      <pluginRepositories>
        <pluginRepository>
          <id>maven-public</id>
          <url>http://192.168.8.8:8888/repository/maven-public/</url>
          <releases>
            <enabled>false</enabled>
          </releases>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </pluginRepository>
      </pluginRepositories>
    </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>
  </profiles>

   <activeProfiles>
    <activeProfile>nexus3</activeProfile>
  </activeProfiles>

3.发布改变世界的jar包吧

做好了前期的这些整体的配置,下面就要对项目进行发布了。由于发布至少会包含快照和正式两种类型,故您可以在pom文件中添加如下的配置:

<distributionManagement>
		<repository>
			<id>maven-releases</id>
			<name>maven-releases</name>
			<url>http://192.168.8.8:8888/repository/maven-releases/</url>
		</repository>
		<snapshotRepository>
			<id>maven-snapshots</id>
			<name>maven-snapshots</name>
			<url>http://192.168.8.8:8888/repository/maven-snapshots/</url>
		</snapshotRepository>
	</distributionManagement>

以上的配置既可以设置在父级pom文件,也可以逐个配置在各个maven模块项目中,您可以依据项目的具体情况来配置。这样您就可以使用mavendeploy命令来进行发布。一般情况下,会先安装在本地,然后再发布到私服上,如果不愿意点击两回,可以配置如下Run/Debug Configuration:

如何搭建公司内部maven仓库_jar包_02

4.源码也发布(更高的精神追求)

当然了,没有我们项目权限的同事会抱怨:“你这个jar包对应的代码里一行注释都没有,我发现有问题也不好给你排查啊!”这个时候你可以慷慨激昂地安慰他:“我把源码发上去就是了,你Dowload Sources”。接下来你这样操作,入世未深的同事只能说一句:“🐂🍺!”

我们在非父项目的pom文件里添加插件:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-source-plugin</artifactId>
    <version>3.0.1</version>
    <executions>
        <execution>
            <id>attach-sources</id>
            <phase>verify</phase>
            <goals>
                <goal>jar-no-fork</goal>
            </goals>
        </execution>
    </executions>
</plugin>

然后在idea中你添加一个Run/Debug Configuration,用来进行源码的上传。

如何搭建公司内部maven仓库_如何搭建公司内部maven仓库_03

这样,你之后只需要选择这个配置执行就可以了。