Веб-приложение JAX-RS (Джерси) во встроенном коте работает в IDE, но не как JAR - PullRequest
1 голос
/ 02 апреля 2020

Я создаю веб-приложение на джерси и использую встроенный tomcat для переносимости. Это довольно просто с одним ресурсом. Проблема, с которой я сталкиваюсь, заключается в том, что когда я запускаю веб-приложение через IDE (intellij), все работает нормально, и я вижу, что мой класс, расширяющий ResourceConfig, инициализируется. Он также отвечает на запрос HTTP. Он работает с IDE как с использованием Gradle, так и с внутренними инструментами сборки

Однако, как только я собираю его с помощью gradle через командную строку, используя плагин shadowJar, в tomcat ничего не загружается. Я вижу, что он ускоряется, но ни одна из строк журнала не появляется, и все мои HTTP-запросы приводят к 404. Я не уверен, как отладить это.

Мой основной класс

public class Main {

    public static void main(String[] args) {
        new Main().start();
    }

    public void start() {

        String port = System.getProperty("port");
        if (port == null) {
            port = "8442";
        }

        Tomcat tomcat = new Tomcat();
        tomcat.setPort(Integer.parseInt(port));
        tomcat.getConnector();

        String absolutePath = new File(".").getAbsolutePath();
        Context context = tomcat.addWebapp("/webapp", absolutePath);

        tomcat.start();
        tomcat.getServer().await();
    }
}

Мой MyApplication класс

@ApplicationPath("app")
public class MyApplication extends ResourceConfig {

    public MyApplication() {
        setApplicationName("My web app");
        LOG.info("Hello!")
        packages("com.xxx.xxx.xxx.resources");
    }
}
apply plugin: 'application'
apply plugin: 'com.github.johnrengelman.shadow'
buildscript {
    dependencies {
        classpath fileTree(dir: '../libs/shadow/', include: '*.jar')
    }
}
mainClassName = 'com.xxx.xxx.xxx.Main'
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11

dependencies {
    implementation libraries.javax_servlet
    implementation libraries.args4j
    implementation libraries.log4j2
    implementation libraries.common_loggings
    implementation libraries.jersey
    implementation libraries.tomcat

    implementation project(":common")

}


jar {
    manifest {
        attributes('Main-Class': 'com.xxx.xxx.xxx.Main')
    }

    from {
        configurations.runtimeClasspath.collect {
            it.isDirectory() ? it : zipTree(it)
        }
    }
}
...