Jak uruchomić plik jar wykonywalnego rozruchu wiosny w środowisku produkcyjnym?

105

Preferowaną metodą wdrażania Spring boot jest wykonywalny plik jar, który zawiera plik tomcat.

Zaczyna się od prostego java -jar myapp.jar.

Teraz chcę wdrożyć ten jar na moim serwerze linux na EC2, czy coś mi brakuje, czy naprawdę muszę utworzyć skrypt inicjujący, aby poprawnie uruchomić aplikację jako demon?

Jeśli po prostu zadzwonię, java -jaraplikacja ginie po wylogowaniu.

Mógłbym uruchomić go w screen lub nohup, ale nie jest to zbyt eleganckie, a ponowne uruchomienie serwera zmusiłoby mnie do zalogowania się i ręcznego uruchomienia procesu.

Więc czy jest już coś do zadania w wiosennym rozruchu?

Cleber Goncalves
źródło
1
nohup / screen (metoda brudna), init / systemd / upstart (metoda właściwa)
@RC Tak, tyle wiem, jak wspomniałem, / sbin / init z niestandardowym skryptem w /etc/init.d wykonałby zadanie, ale czy naprawdę chodzi o to, że każdy powinien zbudować własny skrypt do zarządzania demon (start, stop, restart, status)? Wydaje się, że w tym rozwiązaniu czegoś brakuje.
Cleber Goncalves
Wydaje mi się, że czegoś brakuje w wiosennych butach (przy okazji jest to naprawdę „świeży” projekt), po prostu skontaktuj się z odpowiedzialnym zespołem i złóż propozycję ewolucji.
Cóż, jeśli wygenerujesz archiwum wojenne, możesz użyć wersji swojej dystrybucji na Tomcat, która będzie miała gotowy skrypt startowy. Z drugiej strony, jeśli używasz wykonywalnego podejścia jar, musisz wymyślić własny, niestandardowy skrypt inicjujący. Nie jestem pewien, czy to jest w sferze buta, ale wyraźnie go brakuje, co jest trochę dziwne, dlatego pytam, czy coś przeoczyłem. Będę ich pingował.
Cleber Goncalves
1
Zobacz tutaj, aby zapoznać się z istniejącymi dyskusjami i pomysłami.
Dave Syer

Odpowiedzi:

96

Zwróć uwagę, że od wersji Spring Boot 1.3.0.M1 możesz budować w pełni wykonywalne pliki jar za pomocą Mavena i Gradle.

W przypadku Mavena po prostu uwzględnij w swoim pom.xml:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <executable>true</executable>
    </configuration>
</plugin>

W przypadku Gradle dodaj następujący fragment do swojego build.gradle:

springBoot {
    executable = true
}

W pełni wykonywalny plik jar zawiera dodatkowy skrypt na początku pliku, który umożliwia po prostu dowiązanie symboliczne do słoika Spring Boot init.dlub użycie systemdskryptu.

init.d przykład:

$ln -s /var/yourapp/yourapp.jar /etc/init.d/yourapp

Pozwala to na uruchamianie, zatrzymywanie i ponowne uruchamianie aplikacji, na przykład:

$/etc/init.d/yourapp start|stop|restart

Lub użyj systemdskryptu:

[Unit]
Description=yourapp
After=syslog.target

[Service]
ExecStart=/var/yourapp/yourapp.jar
User=yourapp
WorkingDirectory=/var/yourapp
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

Więcej informacji pod następującymi linkami:

Corleone
źródło
4
Być może będziesz musiał to zrobić, $ chmod +x /etc/init.d/yourappaby móc uruchomić / zatrzymać / ponownie uruchomić
Rohith Nandakumar
Zawsze musisz nadać użytkownikowi usługi uprawnienia do odczytu i wykonywania pliku jar. Musisz także skonfigurować domyślną Javę dla serwera i zmienne środowiskowe Java, aby wszystko działało.
micaro
To nie działa! Wypróbowałem to i otrzymuję następujący błąd: Nie udało się uruchomić MyApp.service: Jednostka MyApp.service not found
Martijn Hiemstra
9

Zdecydowanie najłatwiejszym i najbardziej niezawodnym sposobem uruchamiania aplikacji Spring Boot w środowisku produkcyjnym jest Docker. Użyj Docker Compose, Docker Swarm lub Kubernetes, jeśli chcesz korzystać z wielu połączonych usług.

Oto prosty poradnikDockerfile z oficjalnego przewodnika po platformie Spring Boot Docker :

FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD YOUR-APP-NAME.jar app.jar
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

Oto przykładowa linia poleceń do uruchomienia kontenera jako demona:

docker run \
  -d --restart=always \
  -e "SPRING_PROFILES_ACTIVE=prod" \
  -p 8080:8080 \
  prefix/imagename
mrts
źródło
3

Moja aplikacja rozruchowa Spring ma dwa inicjatory. Jeden do rozwoju, a drugi do produkcji. Do programowania używam głównej metody, takiej jak ta:

@SpringBootApplication
public class MyAppInitializer {

    public static void main(String[] args) {
        SpringApplication.run(MyAppInitializer .class, args);
    }

}

My Initializer dla środowiska produkcyjnego rozszerza SpringBootServletInitializer i wygląda następująco:

@SpringBootApplication
public class MyAppInitializerServlet extends SpringBootServletInitializer{
    private static final Logger log = Logger
            .getLogger(SpringBootServletInitializer.class);
    @Override
    protected SpringApplicationBuilder configure(
            SpringApplicationBuilder builder) {
        log.trace("Initializing the application");
        return builder.sources(MyAppInitializerServlet .class);
    }

}

Używam gradle, a mój plik build.gradle stosuje wtyczkę „ WAR ”. Kiedy uruchamiam go w środowisku programistycznym, używam zadania rozruchowego . Tam, gdzie chcę wdrożyć go do produkcji, używam zadania assemble do wygenerowania WAR i wdrożenia.

Mogę działać jak normalna aplikacja sprężynowa w produkcji, nie pomijając korzyści, jakie zapewnia wbudowany kocur podczas programowania. Mam nadzieję że to pomoże.

O-OF-N
źródło
2

W środowisku produkcyjnym chcesz, aby Twoja aplikacja była ponownie uruchamiana po ponownym uruchomieniu komputera itp., Utworzenie skryptu /etc/init.d/ i połączenie z odpowiednim poziomem pracy w celu uruchomienia i zatrzymania jest właściwym podejściem. Spring Boot nie obejmie tego, ponieważ jest to konfiguracja specyficzna dla systemu operacyjnego i jest mnóstwo innych opcji, czy chcesz, aby działał w więzieniu chroot, czy musi zatrzymać / uruchomić przed jakimś innym oprogramowaniem itp.

spstorey
źródło
2

Możesz użyć aplikacji o nazwie Supervisor . W konfiguracji nadzorcy można zdefiniować wiele usług i sposoby ich wykonywania.

W przypadku aplikacji rozruchowych Java i Spring polecenie byłoby java -jar springbootapp.jar.

Można zapewnić opcje, aby aplikacja zawsze działała, więc jeśli EC2 zrestartuje się, Supervisor ponownie uruchomi aplikację

Uważam, że Supervisor jest łatwy w użyciu w porównaniu do umieszczania skryptów startowych w /etc/init.d/. Skrypty startowe zawieszały się lub przechodziły w stan oczekiwania w przypadku błędów.

unnik
źródło
2

Jeśli używasz gradle, możesz po prostu dodać to do swojego build.gradle

springBoot {
    executable = true
}

Następnie możesz uruchomić aplikację, wpisując ./your-app.jar

W tym miejscu znajdziesz również kompletny przewodnik dotyczący konfiguracji aplikacji jako usługi

56.1.1 Instalacja jako usługa init.d (System V)

http://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html

Twoje zdrowie

isijara
źródło
Właściwie okazuje się, że powinno być bootRepackage { executable = true }Zobacz docs.spring.io/spring-boot/docs/current/reference/html/…
Philippe
2

W systemie operacyjnym Windows bez usługi.

start.bat

@ECHO OFF
call run.bat start

stop.bat:

@ECHO OFF
call run.bat stop

run.bat

@ECHO OFF
IF "%1"=="start" (
    ECHO start myapp
    start "myapp" java -jar -Dspring.profiles.active=staging myapp.jar
) ELSE IF "%1"=="stop" (
    ECHO stop myapp
    TASKKILL /FI "WINDOWTITLE eq myapp"
) ELSE (
    ECHO please, use "run.bat start" or "run.bat stop"
)
pause
Stéphane GRILLON
źródło
1

Uruchamiam aplikacje, które chcę uruchamiać na stałe lub przynajmniej częściowo na stałe, przez screen -dmS NAZWA / ścieżka / do / skryptu. O ile mi wiadomo, jest to najbardziej eleganckie rozwiązanie.

Scrayos
źródło
0

Jest to prosta, możesz użyć wtyczki Spring Boot Maven, aby zakończyć wdrażanie kodu.

konfiguracja wtyczki, taka jak:

<plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <jvmArguments>-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=${debug.port}
                    </jvmArguments>
                    <profiles>
                        <profile>test</profile>
                    </profiles>
                    <executable>true</executable>
                </configuration>
            </plugin>

, A jvmArtumentsto add dla ciebie JVM. profileswybierze profil, aby uruchomić aplikację.executablemoże sprawić, że Twoja aplikacja będzie działać bez przerwy.

i jeśli dodajesz mvnwdo swojego projektu, lub masz maven entuzjazm. Możesz po prostu zadzwonić ./mvnw spring-boot:runpo mvnw lub mavena mvn spring-boot:run.

BeeNoisy
źródło