Я использую Apache Tomcat 7 в дистрибутиве Arch linux, а мой каталог webapps находится по адресу /usr/share/tomcat7/webapps
. В этом каталоге нужно создать каталог и поместить в него каталоги META-INF и WEB-INF с файлами конфигурации xml. Тогда этот каталог будет основным путем для веб-приложения. Так например:
Если /usr/share/tomcat7/webapps/foo/bar.html
содержит:
<!DOCTYPE html>
<html>
<body>
Hello world!
</body>
</html>
затем http://localhost:8080/foo
покажет:
Hello world!
Однако цель состоит в том, чтобы иметь внешний динамический проект (в данном случае распространяемый Netbeans) в виде веб-приложения. Итак, в этом случае я хотел бы разместить свое веб-приложение здесь: /home/user/NetbeansProjects/foo/build/web/
(который содержит bar.html
).
Я придумал три возможных подхода, но ни один из них не работает, и я думаю, что что-то упускаю.
Я подумал, давайте поместим символическую ссылку (символическую ссылку) в каталог webapps с помощью этой команды:
$ ln -s /home/user/NetbeansProjects/foo/build/web /usr/share/tomcat7/webapps/foo
Это кажется наиболее элегантным подходом, но Tomcat не может читать каталог. Почему нет?
Я читал, что вы также можете перенаправить один каталог в другой, используя mount --bind
. Итак, я попытался сделать это:
sudo mount --bind /usr/share/tomcat7/webapps/foo /home/user/NetbeansProjects/foo/build/web
Собственно, это единственное решение, которое действительно работает. К сожалению, если я снова соберу проект, монтирование исчезнет. Я уже пробовал перемонтировать каталог после распространения проекта с помощью <exec/>
в Ant, но это вызывает сбой Linux по какой-то странной причине. Так что это тоже не вариант. Кроме того, перемонтирование после каждой чистой сборки не является чистым подходом. Монтаж также не используется для такого рода вещей, поэтому я полагаю, что решение не будет включать монтаж.
Последнее, что я хочу сделать, это пойти вразрез с рекомендациями разработчиков Apache (посмотреть здесь). Что говорит:
НЕ рекомендуется размещать элементы непосредственно в файле server.xml.
Итак, что мне делать, я беру server.xml по умолчанию и добавляю этот Context-tag к Host-тегу:
<Context docBase="/home/user/NetbeansProjects/foo/build/web/" path="/foo"></Context>
Однако, если я перезапущу службу Tomcat, она не запустится. В лог-файлах я прочитал:
SEVERE: Error starting static Resources
java.lang.IllegalArgumentException: Document base /home/user/NetbeansProjects/foo/build/web does not exist or is not a readable directory
Итак, очевидно, что это какая-то проблема с разрешением. Поскольку я дважды проверил орфографические ошибки, путь должен быть правильным. Но я не могу решить эту проблему, что я сделал для предоставления разрешения tomcat7 (group: tomcat7):
chown -R tomcat7:tomcat7 /home/user/NetbeansProjects/foo/build/web
chmod -R 755 /home/user/NetbeansProjects/foo/build/web
Но после перезапуска Tomcat возникает та же ошибка, и Tomcat не запускается.
Какой из приведенных выше подходов является наиболее разумным и что я делаю не так, что мешает ему работать?
Что @Schrute сказал в комментарии (не ответ): используйте вариант №1 (ln -s
) и просто разрешить связывание в файле Tomcat context.xml. Для Tomcat 7:
<?xml version="1.0" encoding="UTF-8"?>
<Context allowLinking="true">
...
Tomcat 8:
<Context>
<Resources allowLinking="true"></Resources>
...
НЕ ДЕЛАЙТЕ ЭТО В WINDOWS (или любой другой файловой системе без учета регистра), так как это отключит проверку чувствительности к регистру, что позволит раскрыть исходный код JSP среди других проблем безопасности. http://tomcat.apache.org/tomcat-8.0-doc/config/resources.html
Точная причина, по которой Tomcat не может читать каталоги, как в подходах 1 и 3, мне до сих пор неизвестна. Однако Tomcat не может использовать какой-либо каталог, расположенный в /home/user/...
как веб-приложение, даже если это означает использование символических ссылок для ссылки на это местоположение и установку правильных разрешений для каталогов!
Хотя наверное это какая-то встроенная защита. Это все еще странно, потому что такого поведения нет в документации Apache Tomcat (поправьте меня, если я ошибаюсь).
Поэтому решение состоит в том, чтобы использовать любой другой каталог, кроме /home/user/...
, например /usr/share/tomcat7/projects
должно сработать. Но опять же, лучше всего установить вывод моего дистрибутива Netbeans в каталог webapps напрямую, как указано другим человеком (@ user208992).
Итак, чтобы решить эту проблему, вот список инструкций, необходимых для работы Tomcat с Netbeans с использованием внешнего каталога build / dist:
Настройте Netbeans для распространения build
и dist
каталоги в каталог за пределами /home/user/NetbeansProjects/project
.
Отредактируйте следующий файл: /home/user/NetbeansProjects/project/nbproject/project.properties
, и измените строки:
build.dir=build
dist.dir=dist
к
build.dir=/srv/tomcat/project/build
dist.dir=/srv/tomcat/project/dist
Обратите внимание, что вы можете использовать любой каталог (кроме /home/...
) вместо того /srv/tomcat/project
Добавьте контекст с правильной базой документов на хост Tomcat.
Один из способов сделать это - отредактировать server.xml
файл конфигурации, вероятно, находится в /etc/tomcat7/server.xml
. Добавить контекст в server.xml
файл:
<Context docBase="/srv/tomcat/project/build/web/" path="/project"></Context>
Обязательно поместите это в <Host>
-тег. Также вы можете добавлять атрибуты к этому тегу, когда это необходимо (перезагружаемый, antiJARLocking и т. Д.). Или вы также можете поместить в файл xml в CATALINA_HOME/engine(e.g. Catalina)/hostname(e.g. localhost)/project.xml
, один из этих подходов подойдет.
Я хочу указать docBase на .../build/web/
но вы также можете установить это на .../dist/
если вы хотите, чтобы Tomcat использовал WAR-файл.
Убедитесь, что кот в том же users
-группа, как ты. Для этого, например:
usermod --append --groups users tomcat7
Примечание. Достаточно любой общей группы с tomcat. Таким образом, Netbeans и Tomcat могут получить доступ к одному и тому же каталогу.
Исправьте право собственности и разрешения на внешний каталог проекта.
sudo chown -R tomcat7:users /srv/tomcat/project
sudo chmod -R 777 /srv/tomcat/project
Это предполагает, что вы user
являются членами группы users
, и tomcat7
это имя котаs user. You can check this in
cat / etc / passwd`.
Примечание. Позже вы можете уменьшить 777
-permissions, но чтобы убедиться, что Tomcat имеет разрешения, вы можете начать с наиболее доступных разрешений.
Выполните очистку / сборку в Netbeans и перезапустите службу tomcat. При этом будут применены изменения из предыдущих шагов.
Я надеюсь, что это будет полезно для тех, кто сталкивается с подобной ситуацией; Tomcat и разрешения могут быть очень сложными для отладки imho.
Почему бы вам просто не позволить вашим netbeans построить желаемый каталог?
Возможно, стоит попробовать setenforce 0
чтобы отключить selinux и повторно протестировать указанные выше методы, если selinux включен. Если это сработает, повторно включите selinux и начните отслеживать проблемы с разрешениями.
Здесь есть всевозможные проблемы безопасности ... (Если вы хотите сделать что-то подобное в Cent / Oracle / REHL ... большинство системных администраторов скажут вам, что вам придется отключить selinux или потратить несколько часов на поиск журнала аудита )
Короче говоря, нет ничего elegant
о немедленной публикации сборки программного обеспечения в любом месте. Количество потенциально возможных проблем - это кошмар (особенно с java и tomcat, скрывающимся в фоновом режиме).
Возможно, вам стоит вручную выполнить rsync из вашего экземпляра разработки в тестовый экземпляр. (IE под Tomcat). Если вы хотите, чтобы это происходило автоматически ... Вы МОЖЕТЕ добавить это в сценарий сборки.
Пс. У меня нет времени искать сопроводительную документацию ... итак: на мой взгляд, комбинировать этапы разработки и сборки (почти во всех случаях) - не лучшая практика и не "элегантно".
Я согласен с lVlint67 о разделении сборки и развертывания, но я также часто работаю с php / html / javascript в URL-адресе разработчика, где разделение просто мешает. Я использую метод символической ссылки, но уловка в том, что необходимо установить разрешения, чтобы веб-сервер мог читать место назначения символической ссылки.
Я использую:
host:~# mkdir dev
host:~# chown me.www-data dev
host:~# chmod g+rwx dev
host:~# cd /var/www
host:~# ln -s ~/dev ./
Чтобы это работало, вы должны быть членом группы www-data и не забывать, что файлы проекта должны быть доступны для чтения группой, а любые файлы, в которые ваше приложение должно записывать, должны быть доступны для записи для группы.
Это все без SELinux, поэтому ваш пробег может варьироваться в зависимости от конфигурации вашего сервера.