Теперь, когда я обновил свое веб-приложение до Java 8, я столкнулся со странной проблемой загрузки классов с веб-службой оси, которая работает в Tomcat 8.
Самый первый вызов веб-службы после установки веб-приложения вызовет исключение RuntimeException и ошибку «Компилятор не найден в вашем пути к классам! (Вам может потребоваться добавить «tools.jar»)».
Все последующие вызовы этого веб-сервиса работают правильно (видимо, tools.jar все-таки есть?).
Поведение можно воспроизвести, удалив развернутую папку веб-приложения в каталоге развертывания. После следующего запуска tomcat первый вызов снова завершится ошибкой. Если взорванная папка уже существует, перезапуск tomcat не вызывает ошибку.
Ошибка не возникала, когда tomcat/веб-приложение все еще работали с Java 7.
Теперь эта ошибка Оси имеет давнюю, давнюю традицию. Раньше решением было скопировать tools.jar в каталог lib tomcats (он же сделал tools.jar доступным в пути к классам tomcats). По умолчанию его там нет, потому что ось, по-видимому, работает с JRE (даже если вы запускаете tomcat с JDK в JAVA_HOME).
К сожалению, это не помогло. Я попробовал несколько способов поместить tools.jar в путь к классам tomcats:
- Я добавил его в путь к классам через setenv.bat
- Я добавил его в одобренную папку lib
- Больше идей?
Ничто не помогло, самый первый звонок все равно не удавался.
Затем я поиграл с JAVA_HOME и JRE_HOME. Tomcat начинает с JRE, когда это возможно, и использует JDK только в том случае, если вы используете некоторые функции, которым нужен JDK. Я пытался заставить tomcat использовать JDK вместо JRE, но ошибка сохраняется.
Итак, время вопросов:
В чем разница в загрузке классов, когда tomcat взрывает webapp.war по сравнению со случаем, когда война уже была взорвана при более раннем запуске сервера?
При запуске tomcat пишет в лог-файл следующее:
Версия сервера: Apache Tomcat/8.0.15
Дата сборки сервера: 2 ноября 2014 г., 19:25:20 UTC
Номер сервера: 8.0.15.0
Имя ОС: Windows Server 2008 R2
Версия ОС: 6.1
Архитектура: x86
JAVA_HOME: C:\Dev\Java\jdk1.8.0_25\jre
Версия JVM: 1.8.0_25-b18
Поставщик JVM: Oracle Corporation
CATALINA_BASE: C:\Dev\apache-tomcat-8.0.15
CATALINA_HOME: C:\Dev\apache-tomcat-8.0.15
Аргумент командной строки: -Djava.util.logging.config. file=c:\Dev\apache-tomcat-8.0.15\conf\logging.properties
Аргумент командной строки: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
Аргумент командной строки: -Djava.endorsed.dirs=c:\Dev\apache-tomcat-8.0.15\endorsed
Аргумент командной строки: -Dcatalina.base=c:\Dev\apache-tomcat-8.0.15
Командная строка аргумент: -Dcatalina.home=c:\Dev\apache-tomcat-8.0.15
Аргумент командной строки: -Djava.io.tmpdir=c:\Dev\apache-tomcat-8.0.15\temp
так что, по-видимому, он каким-то образом получил ссылку на JRE (хотя я указал только JDK, см. выше). Как я могу это изменить?
- Нет разницы.
Edit2: виновником является компиляция файлов .jws, которую ось выполняет при первом вызове веб-службы. Существование этих скомпилированных файлов является причиной того, что ошибка возникает только при первом вызове.
Конечно, это совсем не объясняет, почему первый вызов завершается с ошибкой "отсутствует компилятор", хотя необходимые скомпилированные файлы созданы и доступны для последующих вызовов...
Изменить: трассировка стека ошибки оси в соответствии с запросом. Ничего особенного по сравнению со всеми другими темами, посвященными отсутствующему файлу tools.jar:
Я добавил его в папку libs