Linux

如何在 Linux 上的 Tomcat 7 中將符號連結作為 webapp 添加到 webapps?

  • December 22, 2019

設置

我在 Arch linux 發行版上使用 Apache Tomcat 7,我的 webapps 目錄位於/usr/share/tomcat7/webapps. 在這個目錄下創建一個目錄,將 META-INF 和 WEB-INF 目錄和 xml 配置文件放在其中。那麼這個目錄將是 webapp 的主路徑。例如:

如果/usr/share/tomcat7/webapps/foo/bar.html包含:

<!DOCTYPE html>
<html>
 <body>
   Hello world!
 </body>
</html>

然後http://localhost:8080/foo會顯示:

Hello world!

但是,我們的目標是將外部動態項目(在本例中由 Netbeans 分發)作為 webapp。所以在這種情況下,我想在這裡找到我的 webapp:(/home/user/NetbeansProjects/foo/build/web/其中包含bar.html)。


我想出了三種可能的方法,但都沒有奏效,我認為我遺漏了一些東西。

方法 1(符號連結)

我在想,讓我們使用以下命令在 webapps 目錄中放置一個符號連結(符號連結):

$ ln -s /home/user/NetbeansProjects/foo/build/web /usr/share/tomcat7/webapps/foo

這似乎是最優雅的方法,但 Tomcat 無法讀取該目錄。為什麼不?


方法 2 (mount –bind)

我讀到您也可以使用mount --bind. 所以我試著這樣做:

sudo mount --bind /usr/share/tomcat7/webapps/foo /home/user/NetbeansProjects/foo/build/web

實際上,這是唯一有效的解決方案。不幸的是,如果我再次建構項目,安裝將消失。在使用 Ant 分發項目後,我已經嘗試重新掛載該目錄<exec/>,但這會使 Linux 因某些奇怪的原因而崩潰。所以這也不是一個選擇。在每次乾淨建構後重新安裝似乎也不是一個乾淨的方法。安裝也沒有真正用於這種東西,所以我想解決方案不會涉及安裝。


方法 3 (server.xml)

我想做的最後一件事是違背 Apache 人的建議(見這裡)。其中說:

不建議將元素直接放在 server.xml 文件中。

那我該怎麼辦,我採用預設的 server.xml 並將這個 Context-tag 添加到 Host-tag 中:

<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無法啟動。


上面哪種方法是最明智的,我做錯了什麼導致它無法工作?

我仍然不知道 Tomcat 無法像方法 1 和 3 那樣讀取目錄的確切原因。但是,Tomcat 似乎不可能將位於下面的任何目錄/home/user/...用作 web 應用程序,即使這意味著使用符號連結連結到該位置並在目錄上設置正確的權限!

儘管這可能是某種內置保護。這仍然很奇怪,因為 Apache Tomcat 文件中沒有列出這種行為(如果我錯了,請糾正我)。

因此,解決方案是使用任何其他目錄/home/user/...,例如/usr/share/tomcat7/projects應該可以工作。但是話又說回來,最好將我的 Netbeans 分發輸出直接設置為 webapps 目錄,正如另一個人(@user208992)所提到的那樣。

因此,為了解決這個問題,這裡列出了使 Tomcat 使用外部 build/dist 目錄與 Netbeans 一起工作所必需的指令列表:

  1. 配置 Netbeans 以將builddist目錄分發到/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 2. 將具有適當 docBase 的 Context 添加到 Tomcat 主機。

一種方法是編輯server.xml可能位於/etc/tomcat7/server.xml. 在server.xml文件中添加上下文:

<Context docBase="/srv/tomcat/project/build/web/" path="/project"></Context>

確保將其放在<Host>-tag 中。您還可以在需要時向該標籤添加屬性(可重新載入、antiJARLocking 等)。或者您也可以將 xml 文件放入 中CATALINA_HOME/engine(e.g. Catalina)/hostname(e.g. localhost)/project.xml,其中一種方法就可以了。

我選擇將 docBase 指向,但如果您希望 Tomcat 使用 WAR 文件,.../build/web/您也可以將其設置為。.../dist/ 3. **確保 tomcat 與您在同一users組中。**為此,例如:

usermod --append --groups users tomcat7

注意:您擁有的任何與 tomcat 共同的組就足夠了。這樣 Netbeans 和 Tomcat 都可以訪問同一個目錄。 4. 修復外部項目目錄的所有權和權限。

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 incat /etc/passwd` 的名稱。

注意:稍後您可以減少777-permissions,但要確保讓 Tomcat 擁有權限,您可以從最容易訪問的權限開始。 5. **在 Netbeans 中清理/建構,然後重新啟動 tomcat 服務。**這將應用前面步驟中的更改。

我希望這對處理類似情況的人有所幫助;Tomcat和權限真的很難調試恕我直言。

引用自:https://serverfault.com/questions/574784