Maven - Как создать проект Java
В этом руководстве мы покажем вам, как использоватьMaven для управления проектом Java - создать, добавить зависимости и упаковать проект Java в исполняемый файл jar. В конце мы создадим исполняемый файл jar для хеширования заданной строки с помощью алгоритма SHA-256.
Используемые технологии:
-
Maven 3.5.3
-
JDK 8
-
Кодек Apache Commons 1.11
1. Создать проект из шаблона Maven
В терминале (* uix или Mac) или в командной строке (Windows) перейдите в папку, в которой вы хотите создать проект Java. Введите эту команду:
mvn archetype:generate
-DgroupId={project-packaging}
-DartifactId={project-name}
-DarchetypeArtifactId={maven-template}
-DinteractiveMode=false
Это указывает Maven сгенерировать проект Java из шаблона Maven. Например,
D:\>mvn archetype:generate -DgroupId=com.example.hashing -DartifactId=java-project -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false ... [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 3.992 s [INFO] Finished at: 2018-09-27T17:15:57+08:00 [INFO] ------------------------------------------------------------------------
Вышеупомянутая команда сгенерирует проект Java из шаблонаmaven-archetype-quickstart.
2. Макет каталога Maven
Будет создана следующая структура каталогов проекта. Короче говоря, исходный код помещается в папку/src/main/java/, код модульного теста помещается в/src/test/java/.

P.S Above figure is captured from IntelliJ IDEA, just ignore those .idea folder.
Note
Прочтите этоMaven
standard directory layout.
3. POM файл
Просмотрите сгенерированныеpom.xml. Он довольно пустой, всего лишь одна зависимость jUnit.
pom.xml
4.0.0 com.example.hashing java-project3 jar 1.0-SNAPSHOT java-project http://maven.apache.org junit junit 3.8.1 test
Этот файл POM похож на файл Antbuild.xml, он описывает всю информацию о проекте, все: от структуры каталогов, плагинов проекта, зависимостей проекта, того, как собрать этот проект и т.д., прочтите этотofficial
POM guide.
4. Обновить POM
4.1 Add compiler properties to tell Maven use a specified JDK version to compile the source code.
UTF-8 1.8 1.8
4.2 Update jUnit to 4.12
junit junit 4.12 test
4.3 Add commons-codec for SHA hashing.
commons-codec
commons-codec
1.11
4.4 Complete updated version.
pom.xml
4.0.0 com.example.hashing java-project jar 1.0-SNAPSHOT java-project http://maven.apache.org UTF-8 1.8 1.8 junit junit 4.12 test commons-codec commons-codec 1.11
5. Написать код
5.1 Update the App.java to accept an input and hash it with a SHA-256 algorithm.
App.java
package com.example.hashing;
import org.apache.commons.codec.digest.DigestUtils;
public class App {
public static void main(String[] args) {
if (args.length < 1) {
System.err.println("Please provide an input!");
System.exit(0);
}
System.out.println(sha256hex(args[0]));
}
public static String sha256hex(String input) {
return DigestUtils.sha256Hex(input);
}
}
5.2 Unit Test.
AppTest.java
package com.example.hashing;
import org.junit.Assert;
import org.junit.Test;
public class AppTest {
private String INPUT = "123456";
@Test
public void testLength() {
Assert.assertEquals(64, App.sha256hex(INPUT).length());
}
@Test
public void testHex() {
String expected = "8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92";
Assert.assertEquals(expected, App.sha256hex(INPUT));
}
}
Готово.
6. Сборка Maven
6.1 Let build it with mvn package
D:\java-project>mvn package [INFO] Scanning for projects... [INFO] [INFO] ------------------< com.example.hashing:java-project >------------------- [INFO] Building java-project 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] ...... ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.example.hashing.AppTest Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.067 sec Results : Tests run: 2, Failures: 0, Errors: 0, Skipped: 0 [INFO] [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ java-project --- [INFO] Building jar: D:\java-project\target\java-project-1.0-SNAPSHOT.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.956 s [INFO] Finished at: 2018-09-28T12:40:18+08:00 [INFO] ------------------------------------------------------------------------
Он компилирует, запускает модульный тест, упаковывает проект в файлjar и помещает его в папкуproject/target.
7. Бег №1
7.1 Run it. Упс… По умолчанию Maven не добавлял зависимости проектаcommons-codec в файл jar.
D:\java-project>java -cp target/java-project-1.0-SNAPSHOT.jar com.example.hashing.App 123456
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/codec/digest/DigestUtils
at com.example.hashing.App.sha256hex(App.java:18)
at com.example.hashing.App.main(App.java:13)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.codec.digest.DigestUtils
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
... 2 more
7.2 To solve it, we can use this maven-shade-plugin to create an uber/fat-jar - group everything into a single jar file.
pom.xml
org.apache.maven.plugins maven-shade-plugin 3.2.0 package shade
7.3 Package it again!
D:\java-project>mvn clean package
[INFO] Scanning for projects...
[...
[INFO] --- maven-shade-plugin:3.2.0:shade (default) @ java-project ---
[INFO] Including commons-codec:commons-codec:jar:1.11 in the shaded jar.
[INFO] Replacing original artifact with shaded artifact.
[INFO] Replacing D:\java-project\target\java-project-1.0-SNAPSHOT.jar
with D:\java-project\target\java-project-1.0-SNAPSHOT-shaded.jar
...
Будут сгенерированы две банки, проверьте размер файла:
D:\java-project>dir target Volume in drive D is Samsung970 Volume Serial Number is 10DF-E63D Directory of D:\java-project\target 28/09/2018 12:57 PM 335,643 java-project-1.0-SNAPSHOT.jar 28/09/2018 12:57 PM 3,053 original-java-project-1.0-SNAPSHOT.jar ...
8. Запуск # 2
8.1 Run it again. Хорошо, результат ожидаемый.
D:\java-project>java -cp target/java-project-1.0-SNAPSHOT.jar com.example.hashing.App 123456 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
8.2 Can we run it as Jar? Нет, основного класса нет.
D:\java-project>java -jar target/java-project-1.0-SNAPSHOT.jar 123456 no main manifest attribute, in target/java-project-1.0-SNAPSHOT.jar
8.3 To solve it, add the main class in maven-shade-plugin like this.
pom.xml
org.apache.maven.plugins maven-shade-plugin 3.2.0 package shade com.example.hashing.App
9. Запуск # 3
9.1 Package it again!
D:\java-project>mvn clean package
9.2 Run it as Jar.
D:\java-project>java -jar target/java-project-1.0-SNAPSHOT.jar 123456 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
Готово.
10. POM
Окончательный файл POM.
pom.xml
4.0.0 com.example.hashing java-project jar 1.0-SNAPSHOT java-project http://maven.apache.org UTF-8 1.8 1.8 junit junit 4.12 test commons-codec commons-codec 1.11 org.apache.maven.plugins maven-shade-plugin 3.2.0 package shade com.example.hashing.App
Скачать исходный код
$ git clone https://github.com/example/maven-examples.git
$ cd java-project
$ mvn package
$ java -jar target/java-project-1.0-SNAPSHOT.jar 123456