Хранимые библиотеки Oracle Java не компилируются

Я хочу хранить библиотеки Java в своей базе данных Oracle. Обратите внимание, что я делаю это впервые. Эта библиотека - pd4ml. Он состоит из двух jar-файлов, содержащих скомпилированные классы.

  • pd4ml.jar
  • ss_css2.jar (требуется для pd4ml.jar)

Поскольку загрузка их с помощью Toad не сработала (Toad сказал, что они были загружены успешно, но они нигде не показывались), я зашел в командную строку (loadjava) и смог успешно загрузить ss_css2.jar. Все его классы были загружены и скомпилированы.

Вторая библиотека, pd4ml.jar, также была загружена, но некоторые классы не компилируются. Я запустил ojvmtc, чтобы попытаться разрешить ссылки. Я получил следующее сообщение:

Следующие классы не найдены:

javax / сервлет / http / HttpServletResponseWrapper

org / zefer / pd4ml / npdf / parser / c

Первый, если я правильно понимаю, должен быть частью JRE, встроенной в 11g r2. Просматривая схему sys, кажется, что она не существует.

Второй - часть библиотеки jar. Я не совсем уверен в структуре скомпилированной Java, мне никогда раньше не приходилось в нее разбираться, но у меня есть несколько файлов .class внутри org/zefer/pd4ml/npdf/parser/, это: c$_b, от _8 _.... до c$_g. Нет ничего, кроме c.

Библиотека хорошо работает на моем локальном компьютере при передаче аргументов командной строки или запуске ее из Eclipse, поэтому она должна работать. Нет конкретного сообщения об ошибке, которое появляется при попытке скомпилировать их в Toad. У меня такое чувство, что это проблема с зависимостями / путями к классам.

Есть ли какие-либо намеки на то, как я должен гарантировать, что классы, содержащиеся в pd4ml.jar, могут правильно обращаться к классам в ss_css2.jar, или какие-либо потенциальные причины для расследования? Возможно, это способ получить подробные сообщения об ошибках из кода Java?


person tdtm    schedule 17.06.2014    source источник
comment
Попробуйте выполнить загрузку из командной строки с помощью команды loadjava, возможно, вы получите более подробную информацию об ошибках. Эта статья может быть помощь. И попробуйте это тоже   -  person Jacob    schedule 23.06.2014
comment
Документация для команды loadjava из командной строки. Когда вы сделаете это впервые, у вас могут возникнуть другие проблемы. Так что лучше использовать опцию отладки на   -  person Jacob    schedule 23.06.2014
comment
Я использовал loadjava без особого успеха (я упомянул о запуске командной строки в моем исходном сообщении, которое могло быть неясным - я отредактировал). Использование команды -verbose дало мне несколько ORA-2953 без какой-либо более подробной информации: они такие же, как недействительные в Toad.   -  person tdtm    schedule 23.06.2014
comment
Вы пробовали использовать опцию отладки при загрузке файлов jar?   -  person Jacob    schedule 23.06.2014
comment
да. Он дает мне несколько ORA-29534 или ORA-29519 по классам в библиотеке, а также один ORA-29521 по javax/servlet/http/HttpServletResponseWrapper.   -  person tdtm    schedule 23.06.2014
comment
Что я помню об использовании loadjava, так это то, что все зависимые файлы jar должны быть доступны, и попробуйте использовать параметр -resolve вместе с отладкой при загрузке файлов jar.   -  person Jacob    schedule 23.06.2014
comment
Оба выполнены вместе с -fileoutput (очень удобно, чтобы ссылаться на / проверять ошибки), увы, не сумев решить проблему. Я должен добавить, что я попытался использовать параметр -genmissing, который избавляет от ORA-29534 или ORA-29519, но вместо этого дает мне ошибки Java (NoSuchMethod).   -  person tdtm    schedule 23.06.2014
comment
Рад знать, что вы так далеко продвинулись. Полагаю, все разрешения выполняются.   -  person Jacob    schedule 23.06.2014


Ответы (1)


Странные имена классов, такие как c $ _b, c $ _c .... до c $ _g, являются результатом обфускации файла JAR. Обфускация влияет только на закрытые классы, поэтому не должна навредить.

Как я вижу, в вашем конкретном случае класс javax / servlet / http / HttpServletResponseWrapper отсутствует (и, вероятно, еще несколько) - классы можно найти в servlet-api.jar. Просто возьмите файл из любого дистрибутива J2EE (или Tomcat) и добавьте его в свой проект / приложение.

В обычных сценариях классы servlet-api требуются только при вызове методов PD4ML, специфичных для WebApp. И методы вызываются только тогда, когда pd4ml.jar является частью веб-приложения (это означает, что servlet-api.jar находится среди ресурсов приложения).

Как я теперь вижу, подсистема Java базы данных Oracle сканирует все ресурсы, на которые есть ссылки (даже если они не нужны в сценарии), и паникует, если чего-то не хватает.

person zfr    schedule 26.06.2014