我在Arch linux发行版上使用Apache Tomcat 7,而我的webapps目录位于/usr/share/tomcat7/webapps 。 在这个目录中,应该创build一个目录,并将META-INF和WEB-INF目录放入xmlconfiguration文件中。 那么这个目录将是webapp的主要path。 因此,例如:
如果/usr/share/tomcat7/webapps/foo/bar.html包含:
<!DOCTYPE html> <html> <body> Hello world! </body> </html>
然后http://localhost:8080/foo会显示:
Hello world!
但是,目标是将外部dynamic项目(在这种情况下由Netbeans分发)作为web应用程序。 所以在这种情况下,我想find我的webapp在这里: /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将一个目录redirect到另一个目录。 所以我试图做到这一点:
sudo mount --bind /usr/share/tomcat7/webapps/foo /home/user/NetbeansProjects/foo/build/web
实际上,这是唯一可行的解决scheme。 不幸的是,如果我再次构build这个项目,坐骑将会消失。 我已经尝试在Ant中使用<exec/>分发项目之后重新安装目录,但是这使得Linux崩溃了一些奇怪的原因。 所以这也不是一个选项。 在每次清理之后重新安装似乎也不是一个干净的方法。 安装也不是真的用于这种东西,所以我想解决scheme不会涉及到安装。
我想做的最后一件事就是违背Apache人的build议( 见这里 )。 其中说:
不build议将元素直接放在server.xml文件中。
那么我该怎么做,我采取了默认的server.xml,并将这个上下文标签添加到主机标签:
<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
所以,显然这必定是某种权限问题。 由于我再次检查拼写错误的path必须是正确的。 但是我无法解决这个问题,我所做的授予tomcat7(组:tomcat7)的权限是:
chown -R tomcat7:tomcat7 /home/user/NetbeansProjects/foo/build/web chmod -R 755 /home/user/NetbeansProjects/foo/build/web
但重启Tomcat后,同样的错误发生,Tomcat无法启动。
上面哪个方法是最明智的,我做错了什么是阻止它的工作?
你为什么不让你的netbeans生成你想要的目录?
为什么Tomcat无法读取方法1和3中的目录的确切原因,我仍然不知道。 然而,Tomcat似乎不可能使用位于/home/user/...下的任何目录作为一个web应用程序,即使这意味着使用符号链接来链接到这个位置,并在目录上设置正确的权限!
虽然这可能是某种内置的保护。 这仍然很奇怪,因为这个行为没有在Apache Tomcat文档中列出(纠正我,如果我错了)。
因此,解决scheme是使用除/home/user/...之外的任何其他目录,例如/usr/share/tomcat7/projects应该可以工作。 但是,再次,最好是将Netbeans分发输出直接设置为webapps目录,就像另一个人( @ user208992 )所提到的那样 。
所以为了解决这个问题,下面是使用外部build / dist目录让Tomcat与Netbeans一起工作的必要指令列表:
configurationNetbeans将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
添加一个正确的docBase的上下文到Tomcat主机。
一种方法是编辑可能位于/etc/tomcat7/server.xml的server.xmlconfiguration文件。 在server.xml文件中添加一个上下文:
<Context docBase="/srv/tomcat/project/build/web/" path="/project"></Context>
确保将其放置在<Host> -tag中。 你也可以在需要的时候给这个标签添加属性(可重新加载,反JARLocking等)。 或者你也可以在CATALINA_HOME/engine(eg Catalina)/hostname(eg localhost)/project.xml放置xml文件,其中一种方法可以。
我select将docBase指向.../build/web/但如果您希望Tomcat使用WAR文件,也可以将其设置为.../dist/ 。
确保tomcat和你在同一个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是tomcat s user. You can check this in的名字s user. You can check this in s user. You can check this in / etc / passwd中s user. You can check this in 。
注意:稍后你可以减less777权限,但是为了确保让Tomcat拥有权限,你可以从最可访问的权限开始。
在Netbeans中清理/构build,并重新启动tomcat服务。 这将应用以前步骤的更改。
我希望这对处理类似情况的人有帮助。 Tomcat和权限可以真的很难debugging恕我直言。
如果启用selinux,可能值得尝试setenforce 0来禁用selinux并重新testing以上方法。 如果有效,重新启用selinux并开始追查权限问题。
这里有各种各样的安全问题…(如果你想在Cent / Oracle / REHL上做这样的事情…大多数系统pipe理员会告诉你,你必须禁用selinux或者花费几个小时追查审计日志)
长话短说,在任何地方即时发布软件版本并没有什么优点。 可能会出现的问题的数量是噩梦的事情(特别是与java和tomcat潜伏在后台)。
从开发实例手动rsync到testing实例可能会很好。 (IE下的Tomcat)。 如果你想它自动发生..你可以把它添加到构build脚本。
PS。 我没有时间去寻找支持文档……所以:在我看来,将开发的构build和部署阶段(几乎在所有情况下)结合起来既不是最好的实践,也不是“优雅的”。
什么@Schrute在评论(而不是答案)中说:使用选项#1( ln -s ),只允许链接在Tomcat的context.xml文件 。 对于Tomcat 7:
<?xml version="1.0" encoding="UTF-8"?> <Context allowLinking="true"> ...
雄猫8:
<Context> <Resources allowLinking="true"></Resources> ...
不要在WINDOWS(或任何其他不区分大小写的文件系统)上执行此操作,因为它将禁用大小写敏感性检查,允许JSP源代码泄露等安全问题。 http://tomcat.apache.org/tomcat-8.0-doc/config/resources.html
我同意lvlint67关于分离构build和部署,但我也经常与PHP / HTML / JavaScript在一个开放的URL的分离似乎阻碍。 我使用符号链接方法,但问题是必须设置权限才能让Web服务器读取符号链接的目标。
我用:
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,所以你的里程可能会有所不同,取决于你的服务器configuration。