В настоящее время я работаю над простым приложением JAX-RS (Джерси), которое подключается к частной базе данных. Из-за того, что это частная собственность, я вынужден запускать свое приложение в ограниченной среде. Мне также нужно включить jar и несколько файлов .so от производителя базы данных, поэтому у меня есть доступ к определенным методам доступа к базе данных. И вот где я не могу найти свое исключение UnsatisfiedLinkError:
Мое приложение должно запускаться внутри контейнера Apache Tomcat от производителя с приложениями внутри, в которые уже загружены все собственные библиотеки, которые мне нужны.
Видимо, я не могу изменить уже запущенные приложения.
Я вынужден использовать версию Java JDK 1.8 и Apache Tomcat 8.5.33.
Для общей информации: мне нужно это маленькое приложение для создания большего, которое кэширует записи, которые он получает от службы RESTful. Я разрабатываю это программное обеспечение, потому что я рассматриваю его в качестве примера в своей дипломной работе бакалавра.
Я провел некоторое исследование и получил ответ пользователя Stackoverflow Бретт Кейл , который описывает 3 решения моей проблемы:
Ошибка UnsatisfiedLink: opencv_java2411.dll уже загружен в другой загрузчик классов в стеклянной рыбе
Загрузка собственной библиотеки из загрузчика классов на уровне сервера, который может использоваться всеми приложениями на сервере и не будет воссоздан при перезапуске приложения. Большинство серверов приложений поддерживают это, но конфигурация зависит от продукта.
Если только собственная программа обращается к собственной библиотеке, но она перезапускается, вместо этого перезапустите всю JVM сервера приложений.
Если несколько приложений обращаются к собственной библиотеке, скопируйте собственную библиотеку в разные места, чтобы заставить JVM дважды загрузить ее.
Первоначально я хотел связаться с этим пользователем и попросить его разработать номер 3, так как это кажется моим единственным жизнеспособным вариантом в моем сценарии. Мне пришлось начинать новый вопрос, потому что я, как новый пользователь, понял, что у меня недостаточно очков Stackoverflow, чтобы прокомментировать его ответ, и вообще общение с пользователем напрямую является нежелательной функцией на этом сайте.
Так может ли кто-нибудь привести мне пример того, как должен выглядеть номер 3? Я сам попробовал, отредактировав setensh.sh/bat, но это не сработало.
Если вам понадобится какой-нибудь код из моего приложения (которое построено с помощью maven), я добавлю его, если потребуется. Я думаю, что код из моего приложения не помог бы прямо сейчас, а просто добавил бы отвлечение от моей настоящей проблемы. Но так как я собрал и упаковал приложение с помощью maven, кажется, что для ясности необходимо добавить мой 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>com.test</groupId>
<artifactId>demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>rest Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>2.28</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.28</version>
</dependency>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>2.28</version>
</dependency>
<dependency>
<groupId>com.canto</groupId>
<artifactId>cumulus</artifactId>
<version>11.1.3.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
<finalName>demo</finalName>
</build>
</project>
Также необходим файл setenv (стандарт производителя):
DYLD_LIBRARY_PATH="/usr/local/Cumulus_WebSolutions/lib"
export DYLD_LIBRARY_PATH
JAVA_HOME=
export JAVA_HOME
JRE_HOME="/usr/local/Cumulus_WebSolutions/jre"
export JRE_HOME
#JAVA_OPTS=-d32
JAVA_OPTS=-Djava.system.class.loader=com.canto.cumulus.utils.ModuleClassLoader
export JAVA_OPTS
CLASSPATH="/usr/local/Cumulus_WebSolutions/CumulusJC.jar"
export CLASSPATH
В общем, когда я компилирую и упаковываю код с помощью maven, я сначала получаю следующую ошибку:
org.glassfish.jersey.server.ContainerException: java.lang.UnsatisfiedLinkError: Native Library /usr/local/Cumulus_WebSolutions/lib/libCumulusJC.jnilib.11.1.3 already loaded in another classloader
После перезагрузки моего приложения появится эта ошибка:
org.glassfish.jersey.server.ContainerException: java.lang.UnsatisfiedLinkError: com.canto.cumulus.Server.openConnection1(Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/canto/cumulus/Server;
Итак, чтобы закончить, кто-нибудь знает, как я могу получить доступ к собственной библиотеке с помощью Java-приложения, в то время как к ним уже обращаются другие развернутые приложения на сервере Tomcat, без необходимости настраивать другие уже существующие приложения?