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