Как решить NoClassDefFoundError на Heroku с помощью Maven? - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь развернуть мое приложение на heroku и получаю NoClassDefFoundError при вызове страницы index.html. Журнал ошибок выглядит так:

    2018-11-04T19:13:02.080531+00:00 heroku[web.1]: Starting process with 
    command `java $JAVA_OPTS -cp target/classes:target/dependency/* 
    com.treslines.server.Server`

    2018-11-04T19:13:05.913978+00:00 app[web.1]: Setting 
    JAVA_TOOL_OPTIONS defaults based on dyno size. Custom settings will 
    override them.

    2018-11-04T19:13:05.926232+00:00 app[web.1]: Picked up 
    JAVA_TOOL_OPTIONS: -Xmx300m -Xss512k -XX:CICompilerCount=2 
    -Dfile.encoding=UTF-8

    2018-11-04T19:13:06.250733+00:00 app[web.1]: Error: A JNI error has 
    occurred, please check your installation and try again

    2018-11-04T19:13:06.250788+00:00 app[web.1]: Exception in thread 
    "main" java.lang.NoClassDefFoundError: com/j256/ormlite/support
    /ConnectionSource

    2018-11-04T19:13:06.250796+00:00 app[web.1]: at 
    java.lang.Class.getDeclaredMethods0(Native Method)

    2018-11-04T19:13:06.250799+00:00 app[web.1]: at 
    java.lang.Class.privateGetDeclaredMethods(Class.java:2701)

    2018-11-04T19:13:06.250801+00:00 app[web.1]: at 
    java.lang.Class.privateGetMethodRecursive(Class.java:3048)

    2018-11-04T19:13:06.250808+00:00 app[web.1]: at 
    java.lang.Class.getMethod0(Class.java:3018)

    2018-11-04T19:13:06.250810+00:00 app[web.1]: at 
    java.lang.Class.getMethod(Class.java:1784)

    2018-11-04T19:13:06.250812+00:00 app[web.1]: at ... 7 more

Итак, я понимаю ошибку, и я посмотрел в папке target / dependency локально, и есть все зависимости отсутствующего класса внутри ormlite-core-5.1 и ormlite-jdbc-5.1 библиотеки.

введите описание изображения здесь

Пока все хорошо. Мой файл про Героку выглядит так:

    web: java $JAVA_OPTS -cp target/classes:target/dependency/* com.treslines.server.Server

В моем maven pom.xml у меня есть эти конфигурации:

...

    <dependency>
        <groupId>com.j256.ormlite</groupId>
        <artifactId>ormlite-core</artifactId>
        <version>5.1</version>
    </dependency>

    <dependency>
        <groupId>com.j256.ormlite</groupId>
        <artifactId>ormlite-jdbc</artifactId>
        <version>5.1</version>
    </dependency>

...

    <configuration>
                <descriptorRefs>
                    <!-- This tells Maven to include all dependencies -->
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <archive>
                    <manifest>
                        <mainClass>com.treslines.server.Server</mainClass>
                    </manifest>
                </archive>
            </configuration>

...

    <plugin>
            <groupId>com.heroku.sdk</groupId>
            <artifactId>heroku-maven-plugin</artifactId>
            <version>0.4.4</version>
            <configuration>
                <jdkVersion>1.8</jdkVersion>
                <!-- Use your own application name >>> heroku enforces lowcase names -->
                <appName>stocknews</appName>
                <processTypes>
                    <!-- Tell Heroku how to launch your application -->
                    <web>java $JAVA_OPTS -cp target/classes:target/dependency/* com.treslines.server.Server</web>
                </processTypes>
            </configuration>
        </plugin>

Код работает локально на localhost, как шарм. Я успешно протолкнул код к героку, все работает нормально, Maven успешно работает и так далее. Но когда я вызываю heroku open по команде cli или набираю URL в браузере, происходит NoClassDefFoundError .

У кого-нибудь есть идеи, как ее решить? Есть ли способ получить доступ к развернутому коду на heroku, чтобы увидеть, что было развернуто эффективно?

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

ПОСТАНОВИЛИ

Разрешение: оба урока по искровой яве и по героку устарели. На сайтах говорилось, что у вас должен быть такой тип процесса:

...

    <web>java $JAVA_OPTS -cp target/classes:target/dependency/* com.treslines.server.Server</web>

...

Однако, при развертывании его на Heroku, maven-assembly-plugin , который у меня был, не создавал папку target / dependecy , как раньше. Чтобы решить эту проблему, вы должны включить отсутствующие зависимости, например:

          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>3.1.1</version>
            <executions>
              <execution>
                <id>copy-dependencies</id>
                <phase>package</phase>
                <goals>
                  <goal>copy-dependencies</goal>
                </goals>
                <configuration>
                  <outputDirectory>target/dependency/</outputDirectory>
                  <overWriteReleases>false</overWriteReleases>
                  <overWriteSnapshots>false</overWriteSnapshots>
                  <overWriteIfNewer>true</overWriteIfNewer>
                </configuration>
              </execution>
            </executions>
          </plugin>

когда вы развертываете свое приложение на heroku, есть также командная строка для просмотра и проверки развернутых артефактов. heroku run bash После этого вы можете набрать ls , чтобы проверить правильность развернутого пакета.

Чем вам просто нужно отправить его своему хозяину heroku, набрав: git push heroku master Maven повторно развернет его, но в этот раз он добавит все зависимости проекта в папку target / Зависимость , как и ожидалось. Теперь вы можете позвонить heroku open , чтобы просмотреть ваше приложение.

0 голосов
/ 05 ноября 2018

Начните с обновления heroku-maven-plugin. Вы на 0.4.4, но последняя версия 2.0.6:

<version>2.0.6</version>
...