cvičení 02

TODO...
Maven - vytvoření projektu
Vytvořte si nový Java projekt s využitím Maven Archetype.
Použijte Archetyp io.github.jez04-cs:java21-quickstart
Vlastní projekt nebude org.example nebo untitled, ale něco smysluplného jako cz.vsb. nebo jakékoliv Vám blízká doména a rozumný název.
Idea - potřebuje nainstalovaný lombok:
new project -> Maven Archetype -> Catalog: Maven Central -> Archatype: napište jez04 najde 3 mé archatypy vyberte výše uvedený -> Advanced Settings -> vyplňte rozumné hodnoty -> Create
Eclipse - potřebuje nainstalovaný lombok:
File -> New -> Maven Project -> Next -> Filter: jez04 -> z nalezených vyperte výše uvedený -> Next -> Vyplňte smysluplně -> Finish
Zmáčkněte < Enter > v záložce Consola
Comand line - nutno mít stažený/nainstalovaný Maven:
mvn archetype:generate -DarchetypeGroupId=io.github.jez04-cs -DarchetypeArtifactId=java21-quickstart -DgroupId=cz.jezek -DartifactId=jez04-test -Dversion=1.0-SNAPSHOT -Dpackage=cz.jezek.testgen
Přidejte závislosti
Přidejte závislosti pro Unit testy v Kelvinu
<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>0.10.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest</artifactId>
<version>3.0</version>
<scope>test</scope>
</dependency>
Naprogramujte
Ze zadaného textu se vytvoří Ascii Art text. Postupujte postupně:
- text načtěte pomocí parametru příkazové řádky jako -text mujTextProPřevod
- Text načtěte z konzol pokud bude aplikace spuštěna s parametrem -cli
Text se nejprve načte je nejprve načten jako parametr z příkazové řádky. Pokud není zadán načítá z konzole.
Pro převod použijte třídu io.github.jez04-cs.lab01text2asciiart.Text2AsciiArt v knihovně io.github.jez04-cs:lab01-text2asciiart:1.0.3 (použijte nejnovější verzi). Knihovna je v repozitáři https://artifactory.cs.vsb.cz/#browse/browse:education-releases jako "maven dependency". (viz přednášky) Je tak nutno přidat vlastní (školní) repozitář.
Kompilace, balení, vyčištění
- mvn compile
- mvn package
- mvn clean
Vytváření balíčku JAR pro distribuci a spouštění bez IDE
"Fat" jar - jar se zabalenými závislostmi (problém s moduly a další)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<!--Set behavior of plugin, which archives should be created see
https://maven.apache.org/plugins/maven-assembly-plugin/descriptor-refs.html-->
<descriptorRefs>
<!--Create FAT jar-->
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<!--Automatically create and add file MANIFEST.MF into jar and set specified properties-->
<manifest>
<mainClass>cz.vsb.fei.App --must be changed</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<!-- Setup that goal single should be automatically executed during phase package-->
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
Spuštění aplikace
- skrze maven: mvn exec:java -Dexec.mainClass=name_of_main_class
- bez maven: java -cp path_to_jar name_of_main_class
- fat jar: java -jar your_fat_jar.jar
"JAR with LIBS" - jar a jeho knihovny
Varování, hodnoty v manifestEntries a manifest jsou senzitivní na nadbytečné mezery a nové řádky, které tam mohou vzniknout například automatickým naformátováním pom.xml.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.8.1</version>
<executions>
<!-- Setup that goal copy-dependencies should be automatically executed during phase package-->
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!--Specify where should be dependencies (libraries) copied-->
<outputDirectory>${project.build.directory}/libs</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.4.2</version>
<configuration>
<archive>
<!--Automatically create and add file MANIFEST.MF into jar and set specified additional properties-->
<manifestEntries>
<Name>cz/vsb/fei/App --must be changed</Name>
<Implementation-Build-Date>${maven.build.timestamp}</Implementation-Build-Date>
<Implementation-Title>${project.groupId}.${project.artifactId}</Implementation-Title>
<Implementation-Vendor>VŠB FEI Departmet of Computer Science</Implementation-Vendor>
<Implementation-Version>${project.version}</Implementation-Version>
</manifestEntries>
<!--Automatically create and add file MANIFEST.MF into jar and set specified properties-->
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>libs/</classpathPrefix>
<mainClass>cz.vsb.fei.App --must be changed</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
Spuštění aplikace
- bez maven: java -jar name_of_jar_file
S využitím JLINK (vytváří samostatné zeštíhlené JDK/JRE)
<plugin>
<!--Plugin create customized version of JDK together with your application which can be
distributed to any computer with same platform where you build this Jlink-->
<artifactId>maven-jlink-plugin</artifactId>
<version>3.2.0</version>
<extensions>true</extensions>
<executions>
<!-- Setup that goal jlink should be automatically executed during phase package-->
<execution>
<id>create-jlink-image</id>
<phase>package</phase>
<goals>
<goal>jlink</goal>
</goals>
</execution>
</executions>
<configuration>
<!--Set classifier name to change suffix of generated file, otherwise module finish with error-->
<classifier>jlink</classifier>
</configuration>
</plugin>
Spouštění
S využitím JLINK image - není třeba JDK:
target/image/bin/java -m cz.vsb.fei.java2.jez04lab01/cz.vsb.fei.java2.jez04lab01.App
Obecně:
target/image/bin/java -m your.module.name/your.module.main.classs.name
Chyba M2E pluginu v Eclipse
Aktuální verze eclipsu má chybu v pluginu, který integruje celý životní cyklus Mavenu do Eclipsu. Má problém s pluginem maven-dependency-plugin, který pro Eclipse není důležitý. Chyba se dá ignorovat, nebo lze použít konfiguraci Mavenu, která plugin v Eclipsu zakáže. stačí přídat do TAGu buid toto:
<pluginManagement>
<plugins>
<!-- Ignore/Execute plugin execution in Eclipse (error of m2e eclipse plugin) -->
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<!-- copy-dependency plugin -->
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<versionRange>[1.0.0,)</versionRange>
<goals>
<goal>copy-dependencies</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore />
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement>