Muszę utworzyć jar ze wszystkimi zależnościami. Mam projekt spring, który pracuje z bazą danych i muszę uruchomić aplikację spring boot na innym komputerze, na którym jest tylko java. Chcę mieć tylko plik jar i zacząć go od java -jar jarname.jar Jak stworzyć ten słoik?

UPD: mój pom teraz:

 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath /> <!-- lookup parent from importer.app.pack.repository -->
    </parent>

    <properties>
        <!-- The main class to start by executing java -jar -->
        <start-class>app.App</start-class>
    </properties>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-shade-plugin</artifactId>
                    <version>2.2</version>
                    <executions>
                        <execution>
                            <phase>package</phase>
                            <goals>
                                <goal>shade</goal>
                            </goals>
                            <configuration>
                                <transformers>
                                    <transformer
                                            implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
                                    <transformer

                                            implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                        <mainClass>app.App</mainClass>
                                    </transformer
>
                                </transformers>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>

    <dependencies>

        <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>javax.persistence-api</artifactId>
            <version>2.2</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.2.8</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.0.1.RELEASE</version>
        </dependency>
    </dependencies>

Kiedy próbuję java -jar jarname.jar w terminalu mam wyjątek: Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/boot/SpringApplication

1
flex_grigorowicz 16 grudzień 2019, 08:11
Czy jest to aplikacja do rozruchu wiosennego?
 – 
Naveen Kulkarni
16 grudzień 2019, 08:14
1
Możliwy duplikat tutaj
 – 
Manoj Kumar
16 grudzień 2019, 08:20
Czy to maven projekt?
 – 
lakshman
16 grudzień 2019, 08:22
Tak, maven projekt w intellij
 – 
flex_grigorowicz
16 grudzień 2019, 08:57
Usuń sekcję pluginManagement. Dodaj sekcję plugins zawierającą spring-boot-maven-plugin, która po prostu robi.
 – 
M. Deinum
16 grudzień 2019, 10:01

1 odpowiedź

Jeśli jest to projekt spring-boot (a zakładam, że tak, ponieważ wyjątek stanowi: brak klasy org/springframework/boot/SpringApplication; ta klasa wyraźnie należy do projektu spring-boot), to nie musisz używać maven shade podłącz.

Zamiast tego użyj spring-boot-maven-plugin. Zobacz tutaj, aby zapoznać się z przykładami możliwych opcji i konfiguracje

<build>
  ...
  <plugins>
    ...
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <version>2.2.2.RELEASE</version> // or your version
      <executions>
        <execution>
          <goals>
            <goal>repackage</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
    ...
  </plugins>
  ...
</build>

Ideą tej wtyczki jest to, że wiosenny rozruch nie jest tak naprawdę grubym słoikiem, ale czymś bardziej skomplikowanym. Ma wewnętrzną strukturę, która tak naprawdę nie wygląda jak jar (na przykład wszystkie zależności są pakietami jako JAR w BOOT-INT/lib, więc masz jar insider)

Ewentualnie, jeśli jest to wiosenny projekt bez wiosennego rozruchu, wyraźnie nie potrzebujesz w ogóle słoików z wiosennymi butami w ścieżce klas. W tym przypadku nie potrzebujesz również spring-boot-maven-plugin.

1
Mark Bramnik 16 grudzień 2019, 10:30