Maven compilation error
-
Έχουμε και εμείς το ίδιο πρόβλημα αλλά αντί για "cant fine symbol TimeListener" το έχουμε με TimeService την ώρα που κάνουμε compile αλλά στο πρόγραμμα δεν εμφανίζει κάποιο warning ή error.Τό πρόγραμμα τρέχει τέλεια από το terminal αφού το κάνουμε build and clean από το netbeans.Φανταζόμαστε ότι σε εσάς θα δουλεύει κανονικά αλλά μπορούμε κάπως να το κάνουμε τεστ για να είμαστε σίγουροι?
-
@it2022131 μπορείς να πεις πως σου δούλεψε τελικά;
-
χρησιμοποιουμε intellij και εχουμε κανει ολα τα βηματα που προαναφερατε, δεν υπαρχουν errors στα mvn clean install και package (η βιβλιοθηκη κατεβαινει κανονικα), την εντοπιζουμε στα αριστερα του intellij στα lib μεσα στο target ως calendar-1.0.0.jar, ωστοσο εξακολουθει να μην αναγνωριζει τα imports για το timeservice και timeteller. (δοκιμασαμε και την επιλογη του maven reload).
-
@acharal Ήθελα να σας ρωτήσω για ένα θέμα που έχουμε όταν κάνουμε mvn package. Όταν εκτελούμε την εντολή, δημιουργείται το target folder μέσα στο οποίο βρίσκεται το jar. Όταν εκτελούμε το java -jar calendar.jar <option> <filename> μέσα στο target folder λειτουργεί κανονικά, άμα αλλάξουμε Directory το .jar και το τοποθετήσουμε πχ στο Desktop δεν τρέχει και βγάζει το εξής error:
Exception in thread "main" java.lang.NoClassDefFoundError: gr/hua/dit/oop2/calendar/TimeService
at org.example.Calendar.printEventsUntilEndOfDay(Calendar.java:118)
at org.example.CalendarApp.main(CalendarApp.java:67)
Caused by: java.lang.ClassNotFoundException: gr.hua.dit.oop2.calendar.TimeService
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 2 more και το pom.xml το οποίο φτιάξαμε είναι με βάση το java-maven-skeleton απλά με ελάχιστες αλλαγές -
Αυτό είναι και το pom.xml μας
<?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>org.example</groupId> <artifactId>calendar</artifactId> <version>1.0-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>11</java.version> </properties> <repositories> <repository> <id>gitlab-maven</id> <url>https://gitlab.com/api/v4/projects/41008035/packages/maven</url> </repository> </repositories> <dependencies> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> </dependency> <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> </dependency> <dependency> <groupId>gr.hua.dit.oop2</groupId> <artifactId>calendar</artifactId> <version>1.0.0</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.31</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>5.7.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> <version>3.20.2</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement> <build> <finalName>calendar</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> </plugin> </plugins> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <release>${java.version}</release> <parameters>true</parameters> <showDeprecation>true</showDeprecation> <failOnWarning>true</failOnWarning> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.2</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.2.0</version> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> <includeScope>runtime</includeScope> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.0</version> <configuration> <archive> <manifest> <addDefaultImplementationEntries>true</addDefaultImplementationEntries> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>org.example.CalendarApp</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </pluginManagement> </build> </project>
-
Είναι φυσιολογικό: Όταν μεταφέρεις το
jar
σε άλλον φάκελο θα χρειαστεί να μεταφέρεις επίσης και τον φάκελοlib
που βρίσκεται μέσα στοtarget
. Εκείνος ο κατάλογος περιέχει ταjar
s των βιβλιοθηκών. Όταν ανοίγει η εφαρμογή ψάχνει να βρει αυτές τις βιβλιοθήκες μέσα σε αυτόν τον φάκελο που είναι στην ίδια θέση με τοjar
της εφαρμογής.Αν θες να μεταφέρεις την εφαρμογή σου ο πιο σωστός τρόπος είναι ένας άλλος που λέγετε fat jar. Με αυτόν τον τρόπο ενσωματώνει ότι χρειάζεται σε ένα μοναδικό "παχουλό"
jar
και μπορείς να μεταφέρεις μόνο αυτό.Κοίτα για παράδειγμα εδώ για το πως να φτιάξεις το
pom.xml
σου ώστε να παράγει τέτοια jars. -
Σας ευχαριστώ πολύ. Το ψάξαμε λίγο και εμείς και βρήκαμε το maven-shade-plugin. Αυτό προσθέτει στο calendar.jar τα jars των βιβλιοθηκών που χρειαζόμαστε και δημιουργεί και ένα original-calendar.jar χωρίς αυτά, που δεν χρειάζεται να χρησιμοποιηθεί. Υπάρχει θέμα να χρησιμοποιήσουμε το maven-shade-plugin και να μην το κάνουμε με maven-assembly-plugin που μας στείλατε;
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.3.0</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <createDependencyReducedPom>false</createDependencyReducedPom> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>org.example.CalendarApp</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin>```