Logger Log4J w projekcie Maven'owym dla Windows i Linuxa

0

Na początku postu informuję, że z Linuxa i Javy jestem słaby zawodnik, więc proszę o wyrozumiałość.😉
Stworzyłem projekt Maven'owy, w którym korzystam z loggera Log4J bazując na tym toutorialu. Aplikacja w formie JAR-a ma działać zarówno na Windows, jak i Linux.
Problem jest taki, że logger Log4J wymaga dołączenia swoich zależności do JAR-a, żeby można go było uruchomić. Dołączenie wykonuje podczas budowania plugin maven-shade-plugin. I teraz, jeśli w Windows zbuduję JAR-a maven'em, to w JAR-ze znajdą się te różne niezbędne dll-ki, które z oczywistych względów w Linuxie nie mają zastosowania, a więc też na Linuxie taki JAR się nie uruchomi (na Windows działa). Jeśli natomiast zbuduję projekt na Linuxie, to JAR nie działa na Windows, bo oczywiście brak tych dll-ek (na Linuxie działa).
Pytanie: da się to jakoś zrobić tak, żeby moja aplikacja używająca Log4J, po zbudowaniu na Linuxie (bo na nim mam Jenkins'owego builder'a), uruchamiała się na obu platformach z JAR-a?

3

Zaraz, skąd w ogóle wytrzasnąłeś dll?
Przecież powinieneś wziąć jary z repo maven
https://mvnrepository.com
Co Ty tu odwolasz xD

0
Aleksander32 napisał(a):

Zaraz, skąd w ogóle wytrzasnąłeś dll?

Przecież powinieneś wziąć jary z repo maven
https://mvnrepository.com
Co Ty tu odwolasz xD

Aż przejrzałem o co chodzi i on ma rację - mianowicie istnieją appendery systemowe:
https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/nt/NTEventLogAppender.html
które wymagają DLLek.

@marogo: ogólnie odpowiedź brzmi: tak, o ile nie będziesz korzystał z appenderów natywnych dla Windowsa.

Dostajesz jakiś konkretny błąd? Pewnie trzeba by go jakoś wyrugować z wywołań - wtedy żadne DLL nie będą potrzebne.
Tak poza tym to jednak sugerowałbym się przesiąść na log4j2. Poprzednia wersja (czyli log4j) jest dosyć wiekowy i projekt został zamknięty w 2015 roku.

1

@marogo:
Ja polecam Slf4j, tu masz opisane :
https://www.baeldung.com/slf4j-with-log4j2-logback

0
Aleksander32 napisał(a):

Zaraz, skąd w ogóle wytrzasnąłeś dll?

Przecież powinieneś wziąć jary z repo maven
https://mvnrepository.com
Co Ty tu odwolasz xD

To nie ja 😁, to ten plugin wsadził do JAR-a te dll-ki, m.in. całą litanię plików api-ms-win-core-....dll. Też mnie to dziwi, że tyle śmieci tam jest. Bez tego pluginu aplikacja zajmowała ok. 400 kB, a z pluginem napuchła do 12 MB (ale tylko po zbudowaniu w Windows, bo pod Linuxem prawie bez zmiany rozmiaru). 😳 Dlatego też pytam o sposób na uruchomienie mojej aplikacji używającej loggera Log4J z JAR-a, najlepiej bez użycia tego pluginu.

0

Zmieniłem na Log4J2 i to samo, a POM mam taki:

<?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.marogo</groupId>
    <artifactId>project</artifactId>
    <version>0.2.0</version>
    <packaging>jar</packaging>

    <name>project</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <mainClass>com.marogo.project.MainApp</mainClass>
        <debugswitch>false</debugswitch>
        <maven.compiler.source>13</maven.compiler.source>
        <maven.compiler.target>13</maven.compiler.target>
    </properties>

    <build>
        <plugins>                        
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                   <release>11</release>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-maven-plugin</artifactId>
                <version>0.0.3</version>
                <configuration>
                    <mainClass>com.marogo.project.MainApp</mainClass>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.marogo.project.MainApp</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
              <artifactId>maven-clean-plugin</artifactId>
              <version>2.4.1</version>
                <configuration>
                 <skip>true</skip>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>    
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>13</version>
        </dependency>

        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>13</version>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.14.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.14.0</version>
        </dependency>
    </dependencies>

</project>

a po uruchomieniu na Windows JAR-a zbudowanego na Linuxie w konsoli dostaję to:

Exception in Application constructor
java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:567)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:567)
        at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)
Caused by: java.lang.RuntimeException: Unable to construct Application instance: class com.marogo.project.MainApp
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:890)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
        at java.base/java.lang.Thread.run(Thread.java:830)
Caused by: java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
        at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java:802)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
        at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
        at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
        at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
        ... 1 more
Caused by: java.lang.NoClassDefFoundError: org/apache/logging/log4j/LogManager
        at com.marogo.project.MainApp.<init>(MainApp.java:37)
        ... 14 more
Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.LogManager
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        ... 15 more
Exception running application com.marogo.project.MainApp
1

Okazuje się, że to napuchnięcie JAR-a tymi dll-kami nie ma nic wspólnego z Log4J(2), gdyż nawet w najprostszym projekcie Maven'owym takiego opasłego JAR-a to generuje ten plugin maven-shade-plugin. Wcześniej używałem pluginu maven-jar-plugin, żeby móc uruchamiać aplikację z JAR-a i działało to dobrze, bez względu na jakim systemie zostało zbudowane, a potem uruchamiane. Dopiero gdy chciałem dodać logowanie z użyciem Log4J(2) przestało działać, tzn. przy próbie uruchomienia JAR-a występuje wyjątek j/w.
Tak więc nadal nie wiem, jak wygenerować działającego JAR-a aplikacji z loggerem Log4J2.

0

z tego co kojarzę, to maven-shadow-plugin jest do podmiany zależności/paczki podczas budowania apki, na jakąś inną, i wydaje mi się, że ładujesz do swojej apki paczki z windowsa, zamiast z linuxa

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.