Как сделать свой Maven Repository на Github?

Вы скорее всего используете Maven, и также подключаете в нем необходимые вам зависимости, но что если вы решили написать свою библиотеку и дать возможность другим пользоваться ею. В этом случае вам необходимо добавить её в Maven репозиторий, об этом и пойдет речь в этом уроке.

Представим что мы пишем очень полезную библиотеку и хотим ею поделится, либо для своих коллег, либо для всех это не важно.

Задача состоит в том как нам сделать эту библиотеку легко доступную для Maven? Путь решения есть, он заключается в создании своего Mavenрепозитория. Почему бы не добавить свою библиотеку в Central Maven Repository? Потому что это не так просто, чтобы это сделать нужно соблюдать много правил, но об этом я возможно расскажу в другом уроке.

Шаг 1. Создание проекта

В этом шаге мы создадим наш проект, который и является нашей супер полезной библиотекой, но по сути это будет пустой проект с одним классом, дамы я мог продемонстрировать суть урока.

Создаем пустой Maven проект:

img

Представим что это наша новая библиотека, которой мы хотим делится через Maven, чтобы её могли подключать как dependency и использовать.

Давайте в проекте создадим пакет:

img

И создадим класс MyFramework.java:

package com.devcolibri.mylib;

public class MyFramework {
    public static void makeAllProject(){
        System.out.println("SUCCESS!");
    }
}

Это и будет нашим супер функционалом фреймворка. Теперь наша цель загрузить его в наш maven repository на gihub.

Шаг 2. Конфигурируем Github

Теперь логинимся в Github и создаем новый репозиторий под ваш проект:

img

прежде чем создавать там Maven Repository нам нужно загрузить проект на Github.

Вот так выглядит создание репозитория у меня:

img

После этого коммитим свой проект в этот репозиторий. Как это сделать можно прочитать тут.

Шаг 3. Конфигурируем site-maven-plugin

site-maven-plugin – это maven плагин, с помощью которого мы сможем загружать нашу библиотеку на github.

Давайте сконфигурируем данный плагин.

<?xml version="1.0" encoding="UTF-8"?>
<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.devcolibri</groupId>
    <artifactId>com.devcolibri.newlib</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <java.version>1.7</java.version>
        <github.global.server>github</github.global.server>
        <github.maven-plugin>0.9</github.maven-plugin>
    </properties>

    <distributionManagement>
        <repository>
            <id>internal.repo</id>
            <name>Temporary Staging Repository</name>
            <url>file://${project.build.directory}/mvn-repo</url>
        </repository>
    </distributionManagement>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-deploy-plugin</artifactId>
                <version>2.8.1</version>
                <configuration>
                    <altDeploymentRepository>internal.repo::default::file://${project.build.directory}/mvn-repo</altDeploymentRepository>
                </configuration>
            </plugin>
            <plugin>
                <groupId>com.github.github</groupId>
                <artifactId>site-maven-plugin</artifactId>
                <version>${github.maven-plugin}</version>
                <configuration>
                    <message>Maven artifacts for ${project.version}</message>
                    <noJekyll>true</noJekyll>
                    <outputDirectory>${project.build.directory}/mvn-repo</outputDirectory>
                    <branch>refs/heads/mvn-repo</branch>
                    <includes><include>**/*</include></includes>
                    <repositoryName>NewLibrary</repositoryName>
                    <repositoryOwner>alexbarchuk</repositoryOwner>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>site</goal>
                        </goals>
                        <phase>deploy</phase>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

В строке 51 мы указываем название репозитория:

img

B в строке 52 мы должны указать свой username на github:

img

Теперь осталось зайти в HOME папку на вашем компьютере, если это Windows, то C:/users//.m2/settings.xml создаем этот файл со следующийм содержимым:

<settings>
  <servers>
    <server>
      <id>github</id>
      <username>[username]</username>
      <password>[password]</password>
    </server>
  </servers>
</settings>

И вместо [username] и [password] пишем свои данные через которые вы авторизируетесь на github.

Шаг 4. Собираем и коммитим библиотеку на Github

Теперь можно собрать и закомитить нашу библиотеку на github, для этого в Intellij IDEA выполните две maven фазы clean + deploy.

img

Вы должны увидеть примерно следующий лог в консоли:

[INFO] Scanning for projects...
[WARNING] 
[WARNING] Some problems were encountered while building the effective model for com.devcolibri:com.devcolibri.newlib:jar:1.0-SNAPSHOT
[WARNING] 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-compiler-plugin is missing. @ line 27, column 21
[WARNING] 
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING] 
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING] 
[INFO] 
[INFO] Using the builder org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder with a thread count of 1
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building com.devcolibri.newlib 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ com.devcolibri.newlib ---
[INFO] Deleting D:\TMP\NewLibrary\com.devcolibri.newlib\target
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ com.devcolibri.newlib ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO] 
[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ com.devcolibri.newlib ---
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 1 source file to D:\TMP\NewLibrary\com.devcolibri.newlib\target\classes
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ com.devcolibri.newlib ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\TMP\NewLibrary\com.devcolibri.newlib\src\test\resources
[INFO] 
[INFO] --- maven-compiler-plugin:2.5.1:testCompile (default-testCompile) @ com.devcolibri.newlib ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ com.devcolibri.newlib ---
[INFO] Tests are skipped.
[INFO] 
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ com.devcolibri.newlib ---
[INFO] Building jar: D:\TMP\NewLibrary\com.devcolibri.newlib\target\com.devcolibri.newlib-1.0-SNAPSHOT.jar
[INFO] 
[INFO] --- maven-install-plugin:2.4:install (default-install) @ com.devcolibri.newlib ---
[INFO] Installing D:\TMP\NewLibrary\com.devcolibri.newlib\target\com.devcolibri.newlib-1.0-SNAPSHOT.jar to C:\Users\Alexander\.m2\repository\com\devcolibri\com.devcolibri.newlib\1.0-SNAPSHOT\com.devcolibri.newlib-1.0-SNAPSHOT.jar
[INFO] Installing D:\TMP\NewLibrary\com.devcolibri.newlib\pom.xml to C:\Users\Alexander\.m2\repository\com\devcolibri\com.devcolibri.newlib\1.0-SNAPSHOT\com.devcolibri.newlib-1.0-SNAPSHOT.pom
[INFO] 
[INFO] --- maven-deploy-plugin:2.8.1:deploy (default-deploy) @ com.devcolibri.newlib ---
[INFO] Using alternate deployment repository internal.repo::default::file://D:\TMP\NewLibrary\com.devcolibri.newlib\target/mvn-repo
Downloading: file://D:\TMP\NewLibrary\com.devcolibri.newlib\target/mvn-repo/com/devcolibri/com.devcolibri.newlib/1.0-SNAPSHOT/maven-metadata.xml
Uploading: file://D:\TMP\NewLibrary\com.devcolibri.newlib\target/mvn-repo/com/devcolibri/com.devcolibri.newlib/1.0-SNAPSHOT/com.devcolibri.newlib-1.0-20140611.031041-1.jar
Uploaded: file://D:\TMP\NewLibrary\com.devcolibri.newlib\target/mvn-repo/com/devcolibri/com.devcolibri.newlib/1.0-SNAPSHOT/com.devcolibri.newlib-1.0-20140611.031041-1.jar (3 KB at 308.6 KB/sec)
Uploading: file://D:\TMP\NewLibrary\com.devcolibri.newlib\target/mvn-repo/com/devcolibri/com.devcolibri.newlib/1.0-SNAPSHOT/com.devcolibri.newlib-1.0-20140611.031041-1.pom
Uploaded: file://D:\TMP\NewLibrary\com.devcolibri.newlib\target/mvn-repo/com/devcolibri/com.devcolibri.newlib/1.0-SNAPSHOT/com.devcolibri.newlib-1.0-20140611.031041-1.pom (3 KB at 363.1 KB/sec)
Downloading: file://D:\TMP\NewLibrary\com.devcolibri.newlib\target/mvn-repo/com/devcolibri/com.devcolibri.newlib/maven-metadata.xml
Uploading: file://D:\TMP\NewLibrary\com.devcolibri.newlib\target/mvn-repo/com/devcolibri/com.devcolibri.newlib/1.0-SNAPSHOT/maven-metadata.xml
Uploaded: file://D:\TMP\NewLibrary\com.devcolibri.newlib\target/mvn-repo/com/devcolibri/com.devcolibri.newlib/1.0-SNAPSHOT/maven-metadata.xml (779 B at 108.7 KB/sec)
Uploading: file://D:\TMP\NewLibrary\com.devcolibri.newlib\target/mvn-repo/com/devcolibri/com.devcolibri.newlib/maven-metadata.xml
Uploaded: file://D:\TMP\NewLibrary\com.devcolibri.newlib\target/mvn-repo/com/devcolibri/com.devcolibri.newlib/maven-metadata.xml (293 B at 15.9 KB/sec)
[INFO] 
[INFO] --- site-maven-plugin:0.9:site (default) @ com.devcolibri.newlib ---
[INFO] Creating 12 blobs
[INFO] Creating tree with 13 blob entries
[INFO] Creating commit with SHA-1: b23c8d474f02c8585ccc7eed7c5772df642b3745
[INFO] Creating reference refs/heads/mvn-repo starting at commit b23c8d474f02c8585ccc7eed7c5772df642b3745
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

Где [INFO] BUILD SUCCESS говорит о том, что ваша библиотека была успешно загруженна на Github.

Теперь можите зайти на github в свой репозиторий и раскрыть список веток (branch):

img

И если вы перейдете в эту ветку то там будет собраная библиотека которую мы загружали.

Шаг 4. Подключаем нашу библиотеку в наш новый проект

Теперь давайте подключим библиотеку в наш новый проект, для этого мы в pom.xml добавляем свой репозиторий:

<repositories>
    <repository>
        <id>[name-project]-mvn-repo</id>
        <url>https://raw.github.com/[username]/[name-project]/mvn-repo/</url>
        <snapshots>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
        </snapshots>
    </repository>
</repositories>

После этого maven будет понимать откуда брать вашу библиотеку.

[name-project] – это имя вашего проекта, в нашем случае это NewLibrary

[username] – это ваш логин на github, в моем случае это: alexbarchuk

Теперь нужно подключить саму зависимость:

<dependency>
    <groupId>com.devcolibri</groupId>
    <artifactId>com.devcolibri.newlib</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

Вот и все, ваш персональный репозиторий готов.

Оригинал на devcloibri