cvičení 01
 
    Použití sestavovacího nástroje Maven a vytváření samostatně spustitelných balíčků
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>
Řešení
Řešení najdete v https://gitlab.vsb.cz/jez04-vyuka/java2/labs/java2lab01v1/-/tree/solution?ref_type=heads ve větvi solution
 David Ježek
        David Ježek
        



