Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 30

0
votes
answers
33 views
+10

Where are compiled JSP Java (*__jsp.java) files?

I am getting a javax.servlet.jsp.JspException in one of the jsp files that my website is trying to render (survey.jsp). However, the stack trace does not give me the the specific line in jsp where it fails but rather the line number where it fails in (survey_jsp.java:787), which seems to be the compiled JSP file. Where do I find such files, so that I know what line is throwing this exception?

Thanks

EDIT: These files live in the /work directory if you are using tomcat as Will suggested in the comment below.

28
votes
answers
32 views
+10

Separating war application name from war file name

Currently if i deploy a war file on tomcat named say myapp.war, I can access its url by http://localhost/myapp/MyServlet.

However what I want is to deploy a war with a version number in the war file name and still have the same url. For eg, I want to deploy myapp-1.1.0.war and still have the url be http://localhost/myapp/MyServlet

Of course I need to keep updating the war and the version number will keep changing, so I cant hardcode the war filename anywhere. Is there any setting in web.xml I can use to keep the same url for the app regardless of the war filename?

沙发
板凳
+80

您可以使用YOUR_WAR / META-INF / context.xml。以下是一個示例:

 <?xml version =“1.0”encoding =“UTF-8”?> < Context antiJARLocking =“true”path =“/ MyServlet”/>  
     
			
        

@Matthew Gillard據我所知,tomcat文檔說不要在Server.xml中放置Context元素。它們對META-INF / context.xml沒有任何問題。文檔甚至會告訴您context.xml的工作原理。從文檔:“可以顯式定義上下文元素:*在$ CATALINA_BASE / conf / context.xml文件中:Context元素信息將由所有webapps加載。” - Karthik Ramachandran 2011年5月3日21:03

我誤讀了嗎?“path”部分說:“除非在server.xml中靜態定義Context,否則不得設置此字段的值” - Matthew Gilliard 2011年5月3日21:08

不適用於Tomcat 7.0.11。 - 帕維爾11月30日在5:29

不適用於Tomcat 7.0.26 - Marcus Junius Brutus 2014年12月3日15:00

不適用於Tomcat 8.0.15 - JustinKSU 2014年12月26日21:01

地板
+40

使用 Maven 時,您可以通過執行以下操作來控制部署的路徑:

Tomcat的conf / tomcat-users.xml:

 &lt; tomcat-users&gt; &lt; role rolename =“manager-gui”/&gt; &lt; role rolename =“manager-script”/&gt; &lt; role rolename =“manager-jmx”/&gt; &lt; role rolename =“manager-status”/&gt; &lt; role rolename =“admin-gui”/&gt; &lt; role rolename =“admin-script”/&gt; &lt; user username =“root”password =“root”roles =“manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script”/&gt; &LT; / Tomcat的用戶&GT; < / code>  

?/ .m2 / settings.xml:

  ...&lt; server&gt; &LT; ID&GT; Tomcat的&LT; / ID&GT; &lt;用戶名&GT;根&LT; /用戶名&gt; &LT;密碼&GT;根&LT; /密碼&GT; &LT; /服務器&GT; ...   

pom.xml:

  ...&lt; modelVersion&gt; 4.0.0&lt; / modelVersion&gt; &LT;&的groupId GT; com。示例&LT; /&的groupId GT; &LT; artifactId的&GT; MYAPP&LT; / artifactId的&GT; &LT;版本&GT; 1.1.0&LT; /版本&GT; &LT;包裝和GT;戰爭&LT; /包裝&GT; ...&lt; build&gt; &LT;插件&GT; &LT;插件&GT; &LT;&的groupId GT; org.codehaus.mojo&LT; /&的groupId GT; &LT; 的artifactId&GT; Tomcat的行家-插件&LT; / artifactId的&GT; &LT;結構&gt; &lt;! - 在Tomcat7下面忽略/ html: - &gt; &LT; URL&GT; HTTP://服務器:8080 /經理/ HTML&LT; / URL&GT; &lt;! - 請參閱?/ .m2 / settings.xml中的服務器設置 - &gt; &LT;服務器&GT; Tomcat的&LT; /服務器&GT; &LT;路徑&GT; / myWebApp&LT; /路徑&GT; &LT; /結構&gt; &LT; /插件&GT; ....&lt; / plugins&gt; &LT; /構建&GT; ...   

首先啟動tomcat然後構建並部署應用程序..

  mvn clean install tomcat:deploy   

..它可以在 http:// server下訪問:

@nir感謝你的糾正 - Lorand Bendig於2014年8月19日22:09

4楼
+10

web.xml中沒有為此設置。我不相信有可能以交叉容器的方式在war文件中設置它 - 在規範中沒有提到它 - 所以每個容器以不同的方式做到這一點。 jboss-web.xml sun-web.xml context.xml 等。

5楼
+10

我更喜歡使用“ ## ”符號來記錄tomcat中* .war文件的版本。
例如:
myapp.war - &gt;
URL: http:// localhost:8080 / myapp / MyServlet
myapp ## 1.1.0 - &gt;
網址: http:// localhost:8080 / myapp / MyServlet (仍然相同,因為之後的所有符號“ ## ”被tomcat忽略了)

6楼
0
deployOnStartup和autoDeploy都是false 如果不遵循此規則,可能會導致雙重部署。

所以在我的情況下,我切換了 deployOnStartup autoDeploy 為false,所以我的WAR(egaWAR)沒有自動展開到webapps下的'a'目錄,而是自動展開到'b'目錄,由於這些設置:

 &lt; Host name = “localhost”appBase =“webapps”autoDeploy =“false”deployOnStartup =“false”unpackWARs =“true”deployIgnore =“$ {ignore.context}”&gt; &lt; Context docBase =“a”path =“/ b”/&gt; &LT; /主機&GT;   如果不遵循此規則,可能會導致雙重部署。  

所以在我的情況下,我切換了 deployOnStartup autoDeploy 為false,所以我的WAR(egaWAR)沒有自動展開到webapps下的'a'目錄,而是自動展開到'b'目錄,由於這些設置:

 &lt; Host name = “localhost”appBase =“webapps”autoDeploy =“false”deployOnStartup =“false”unpackWARs =“true”deployIgnore =“$ {ignore.context}”&gt; &lt; Context docBase =“a”path =“/ b”/&gt; &LT; /主機&GT;   如果不遵循此規則,可能會導致雙重部署。  

所以在我的情況下,我切換了 deployOnStartup autoDeploy 為false,所以我的WAR(egaWAR)沒有自動展開到webapps下的'a'目錄,而是自動展開到'b'目錄,由於這些設置:

 &lt; Host name = “localhost”appBase =“webapps”autoDeploy =“false”deployOnStartup =“false”unpackWARs =“true”deployIgnore =“$ {ignore.context}”&gt; &lt; Context docBase =“a”path =“/ b”/&gt; &LT; /主機&GT;   

所以在我的情況下,我將 deployOnStartup autoDeploy 都切換為false,因此我的WAR(egaWAR)沒有自動展開到webapps下的'a'目錄,但由於這些設置,轉而進入'b'目錄:

 &lt; Host name =“localhost”appBase =“webapps”autoDeploy =“false”deployOnStartup =“false”unpackWARs =“true “deployIgnore =”$ {ignore.context}“&gt; &lt; Context docBase =“a”path =“/ b”/&gt; &LT; /主機&GT;   

所以在我的情況下,我將 deployOnStartup autoDeploy 都切換為false,因此我的WAR(egaWAR)沒有自動展開到webapps下的'a'目錄,但由於這些設置,轉而進入'b'目錄:

 &lt; Host name =“localhost”appBase =“webapps”autoDeploy =“false”deployOnStartup =“false”unpackWARs =“true “deployIgnore =”$ {ignore.context}“&gt; &lt; Context docBase =“a”path =“/ b”/&gt; &LT; /主機&GT;   WAR)沒有自動展開到webapps下的'a'目錄,而是自動展開到'b'目錄,由於這些設置: 
 &lt; Host name =“localhost”appBase =“webapps “autoDeploy =”false“deployOnStartup =”false“unpackWARs =”true“deployIgnore =”$ {ignore.context}“&gt; &lt; Context docBase =“a”path =“/ b”/&gt; &LT; /主機&GT;   WAR)沒有自動展開到webapps下的'a'目錄,而是自動展開到'b'目錄,由於這些設置: 
 &lt; Host name =“localhost”appBase =“webapps “autoDeploy =”false“deployOnStartup =”false“unpackWARs =”true“deployIgnore =”$ {ignore.context}“&gt; &lt; Context docBase =“a”path =“/ b”/&gt; &LT; /主機&GT;  
     
			
        
0
votes
answers
31 views
+10

在部署war包後tomcat的webapps目錄下有很多額外的.aut文件

0

我的web應用使用maven來生成war包和tomcat作爲server.But有些人發現,在將war包部署到webapps之後,還有很多額外的.aut文件以及我的項目的有用文件,就像這樣: enter image description here在部署war包後tomcat的webapps目錄下有很多額外的.aut文件

我真的不知道爲什麼,有人可以提出一些想法嗎?

沙发
0
0

的原因是automaton.jar提取到項目目錄 enter image description here

284
votes
answers
38 views
+10

Where can I view Tomcat log files in Eclipse?

Where can I view Tomcat log files in Eclipse?

For some reason my Tomcat installation/log folder is always empty.

BTW, does Tomcat dump to the log file after a while or is it immediate?

up vote 79 down vote accepted favorite
沙发
+790
+50

轉到“服務器”視圖,然後雙擊您正在運行的Tomcat服務器。訪問日誌文件相對於“服務器路徑”字段中的路徑存儲,該字段本身相對於工作空間路徑。

服務器路徑字段說:.metadata.pluginsorg.eclipse.wst.server.core mp0在哪裡? - 布蘭克曼2010年2月9日22:52

它指的是你的工作區。在那裡你找到一個名為.metadata的文件夾,等等。 - Nils Schmidt 2010年2月9日23:08

確定發現該文件夾感謝@Nils,但/ logs仍然是空的... - 布蘭克曼2010年2月9日23:12

這是Tomcat部署的位置,但不是日誌文件。@codesta有正確的答案。 - SimplGy 12月7日在23:30

該文件夾是空的,codesta答案是對的 - 恩里克聖馬丁11年11月15日13:43

+1710

我不確定你是否在使用catalina.out或Tomcat生成的其他日誌之後。

但是,如果您在catalina.out日誌文件之後,請按照以下說明操作:

  • 在服務器選項卡中,雙擊Tomcat服務器。您將看到一個名為Overview的屏幕。

  • 單擊“打開啟動配置”。單擊“公共”選項卡。

  • 在屏幕底部,您可以選中“文件”複選框,然後指定可用於記錄控制台的文件( catalina.out)輸出。

  • 最後,重新啟動Tomcat服務器。

這樣可行,但Eclipse方式與生產用途截然不同! - Nicolas Zozol 2013年6月15日19:22

作品。好的。 - Karan Ahuja 18年7月18日9:38

+160

另一個論壇提供了這個答案:

啊,想出來了。需要設置以下系統屬性,以便可以拾取“logging.properties”文件。

假設tomcat位於Eclipse項目下,請在其啟動配置的“Arguments”選項卡下添加以下內容:

  -Dcatalina.base =“$ {project_loc}&LT; Apache的Tomcat的5.5.23_loc&gt;”中 -Dcatalina.home =“$ {project_loc}&LT; Apache的Tomcat的5.5.23_loc&gt;”中 -Djava.util.logging.config.file =“$ {project_loc}&lt; apache-tomcat-5.5.23_loc&gt; conflogging.properties”-Djava.util.logging.manager = org.apache.juli.ClassLoaderLogManager   

+110

看起來日誌分散了嗎?我在&lt; ProjectLocation&gt; .metadata.pluginsorg.eclipse.wst.server.core mp0logs 下找到了訪問日誌

這是對這個問題的最直接的答案:“我在哪裡可以查看Eclipse中的Tomcat日誌文件?” 它不是在eclipse中完成的,但就我而言,這是一個積極因素,因為我可以在一個完全獨立的窗口中選擇視圖來查看它們。其他答案似乎專注於配置eclipse以將文件放在方便的地方。 - 邁克爾波特2016年1月15日3:09

可以直接在Eclipse控制台窗口中查看catalina.out文件。 - 邁克爾波特2016年1月15日4:01

@Michael_potter如果您運行的是客戶端程序,請不要。 - DS。18年12月12日10:18

+30

雙擊並打開服務器。轉到'參數'。-Dcatalina.base = ..東西。去那個東西。你的日誌就在那裡。

+20

@royalsampler說

轉到Eclipse中的Servers視圖然後右鍵單擊服務器,然後單擊“打開”。日誌文件存儲在與“服務器路徑”字段中的路徑相關的文件夾中。

由於路徑字段不可編輯,您還可以“打開啟動配置”,單擊“參數”選項卡,複製catalina.base的VM參數(在引號內)。這是WTP webapp目錄的完整路徑。將值複製到剪貼板可以節省您將文件系統瀏覽到路徑的繁重任務。

另請注意,在運行或調試時,您應該在Console視圖中看到輸出到日誌文件。

+10

如果您希望將日誌放在控制台以外的單獨文件中:雙擊服務器 - &gt; 打開啟動配置 - &gt; 參數 - &gt; add -Dlog.dir =“您要存儲此文件的路徑”並重新啟動服務器。

提示:在嘗試添加參數時,請確保服務器未運行。你應該有log4j或類似的日誌框架。

+10

如果您正在使用catalina.out日誌並且您正在使用帶有tomcat的eclispe,這對我有用:

  • 在您的計算機中創建catelina.out。在我的情況下,我把它放在我的tomcat安裝目錄的logs目錄中,例如:/opt/apache-tomcat-7.0.83/logs/catena.out
  • 轉到你的eclipse,在服務器選項卡中,雙擊Tomcat服務器。您將看到一個名為Overview的屏幕。
  • 單擊“打開啟動配置”。然後單擊“Common”選項卡。
  • 在標準輸入和輸出部分,選中“輸出文件”,單擊文件系統,然後選擇創建catelina.out的文件夾。
  • 最後,重新啟動Tomcat服務器。
0
votes
answers
42 views
+10

Tomcat啓動問題

0

我正在使用與Netbeans 6.5集成的tomcat6(分發)。它沒有任何問題,現在突然停止工作。現在,如果我嘗試從控制檯中的netbeans啓動Tomcat,它將打印服務器在幾毫秒內啓動並且所有其他事物都會緊隨其後,netbeans將繼續顯示「啓動tomcat」狀態欄並最終顯示「Tomcat啓動失敗」。任何人都可以幫我解決這個問題嗎?下面是控制檯輸出,同時啓動NetBeansTomcat啓動問題

Using CATALINA_BASE: E:Tomcat distriapache-tomcat-6.0.20 
Using CATALINA_HOME: E:Tomcat distriapache-tomcat-6.0.20 
Using CATALINA_TMPDIR: E:Tomcat distriapache-tomcat-6.0.20	emp 
Using JRE_HOME:  C:Program FilesJavajdk1.6.0_11 
Sep 22, 2009 10:52:28 AM org.apache.catalina.core.AprLifecycleListener init 
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:Program FilesJavajdk1.6.0_11in;.;C:SYSROOTSunJavain;C:SYSROOTsystem32;C:SYSROOT;C:Program FilesJavajdk1.6.0_11in;E:Oracleproduct10.1.0Client_4in;E:Oracleproduct10.1.0Client_4jre1.4.2inclient;E:Oracleproduct10.1.0Client_4jre1.4.2in;C:SYSROOTsystem32;C:SYSROOT;C:SYSROOTSYSTEM;C:SYSROOTsystem32Wbem;C:Program FilesCAeTrustITM;C:Program FilesCASharedComponentsScanEngine;C:Program FilesCASharedComponentsCAUpdate;C:Program FilesCASharedComponentsThirdParty;C:Program FilesCASharedComponentsSubscriptionLicense;C:Program FilesTortoiseSVNin;E:Thomas 
Sep 22, 2009 10:52:28 AM org.apache.coyote.http11.Http11Protocol init 
INFO: Initializing Coyote HTTP/1.1 on http-8080 
Sep 22, 2009 10:52:28 AM org.apache.catalina.startup.Catalina load 
INFO: Initialization processed in 999 ms 
Sep 22, 2009 10:52:28 AM org.apache.catalina.core.StandardService start 
INFO: Starting service Catalina 
Sep 22, 2009 10:52:28 AM org.apache.catalina.core.StandardEngine start 
INFO: Starting Servlet Engine: Apache Tomcat/6.0.20 
Sep 22, 2009 10:52:29 AM org.apache.coyote.http11.Http11Protocol start 
INFO: Starting Coyote HTTP/1.1 on http-8080 
Sep 22, 2009 10:52:29 AM org.apache.jk.common.ChannelSocket init 
INFO: JK: ajp13 listening on /0.0.0.0:8009 
Sep 22, 2009 10:52:29 AM org.apache.jk.server.JkMain start 
INFO: Jk running ID=0 time=0/47 config=null 
Sep 22, 2009 10:52:29 AM org.apache.catalina.startup.Catalina start 
INFO: Server startup in 974 ms 

Tomcat的日誌:

Sep 22, 2009 10:36:46 AM org.apache.catalina.core.ApplicationContext log 
INFO: ContextListener: contextInitialized() 
Sep 22, 2009 10:36:46 AM org.apache.catalina.core.ApplicationContext log 
INFO: SessionListener: contextInitialized() 
Sep 22, 2009 10:52:29 AM org.apache.catalina.core.ApplicationContext log 
INFO: ContextListener: contextInitialized() 
Sep 22, 2009 10:52:29 AM org.apache.catalina.core.ApplicationContext log 
INFO: SessionListener: contextInitialized() 
+0

嘗試重新啓動系統後啓動tomcat。會有更多的日誌。請張貼 – 2013-07-23 06:22:49

沙发
0
0

我不熟悉的網豆,但似乎它推出一個「空」的tomcat,然後執行應用程序的熱部署。

+0

它正確地部署應用程序..即使tomcat正在開始..但netbeans仍然顯示錯誤.. – 2009-09-24 05:23:42

+0

您可以請張貼日誌中的一些例外(如果有的話) – 2009-09-24 06:46:21

0
votes
answers
39 views
+10

在tomcat中啓動的automativ線程

0

我想要一個線程在tmocat上的應用程序啓動時啓動automaticalyy。 我該怎麼做。我必須添加一些東西到web.xml?在tomcat中啓動的automativ線程

沙发
0
2

你可以用SerlvetContextListener來做到這一點。

創建一個實現了ServletContextListener接口的類:

import javax.servlet.*; 
import javax.servlet.http.*; 

public class ApplicationStartup implements ServletContextListener { 

    public void contextInitialized(ServletContextEvent event) { 
    // Do work here... 
    // new Thread().start(); etc... 
    } 

    public void contextDestroyed(ServletContextEvent event) 
    { 
    // Stop work here if required 
    } 
} 

你的類添加到web.xml文件:

<?xml version="1.0" encoding="ISO-8859-1"?> 

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/j2ee/dtds/web-app_2.3.dtd"> 

<web-app> 

    <!-- Listeners --> 
    <listener> 
    <listener-class>ApplicationStartup</listener-class> 
    </listener> 

</web-app> 
板凳
0
1

這不是一個好主意,開始在Tomcat中你自己的線程或任何其他Java EE容器(SO中的許多相關問題)。你會更好使用Quartz調度程序。

0
votes
answers
33 views
+10

在servlet中啓動線程,有什麼問題?

1

我有一個web應用程序,在單個請求可能需要加載數百個數據。現在問題是數據是分散的。所以,我必須從幾個地方加載數據,在它們上應用過濾器,處理它們然後做出響應。依次執行所有這些操作使得servlet 變得緩慢在servlet中啓動線程,有什麼問題?

因此,我曾想過在單獨的線程中加載所有數據,例如t[i] = new Thread(loadData).start();,等待所有線程完成使用while(i < count) t[i].join();並且完成後,加入數據並作出響應。

現在我不確定這種方法是對的還是有一些更好的方法。我讀過的地方是servlet中的產卵線程是不可取的。

我想要的代碼看起來像這樣。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{ 
     Iterable<?> requireddata = requiredData(request); 
     Thread[] t = new Thread[requireddata.size]; 
     int i = 0; 
     while (requireddata.hasNext()) 
     { 
      t[i] = new Thread(new loadData(requiredata.next())).start(); 
      i++; 
     } 
     for(i = 0 ; i < t.length ; i++) 
     t[i].join(); 
     // after getting the data process and respond! 
} 
沙发
0
6

的主要問題是,你把服務器癱瘓,如果許多併發請求來爲你的servlet,因爲你不限制可以產生的線程數。另一個問題是你不斷重新創建新線程,而不是重用它們,效率不高。

這兩個問題很容易通過使用線程池解決。 Java對它們有本地支持。閱讀the tutorial

另外,請確保在webapp關閉時使用ServletContextListener關閉線程池。

板凳
0
0

您可以考慮使用java.util.concurrent api中的Executor框架。例如,您可以將計算任務創建爲Callable,然後將該任務提交給ThreadPoolExecutor。從Java併發示例代碼的實際應用: -

public class Renderer { 
    private final ExecutorService executor; 
    Renderer(ExecutorService executor) { this.executor = executor; } 

    void renderPage(CharSequence source) { 
     final List<ImageInfo> info = scanForImageInfo(source); 
     CompletionService<ImageData> completionService = 
      new ExecutorCompletionService<ImageData>(executor); 
    for (final ImageInfo imageInfo : info) 
     completionService.submit(new Callable<ImageData>() { 
      public ImageData call() { 
       return imageInfo.downloadImage(); 
       } 
       }); 
renderText(source); 
try { 
    for (int t = 0, n = info.size(); t < n; t++) { 
    Future<ImageData> f = completionService.take(); 
    ImageData imageData = f.get(); 
    renderImage(imageData); 
    } 
} catch (InterruptedException e) { 
    Thread.currentThread().interrupt(); 
} catch (ExecutionException e) { 
    throw launderThrowable(e.getCause()); 
} 
    } 
} 
地板
0
0

聽起來像是爲CyclicBarrier一個問題。

例如:

ExecutorService executor = Executors.newFixedThreadPool(requireddata.size); 

public void executeAllAndAwaitCompletion(List<? extends T> threads){ 
    final CyclicBarrier barrier = new CyclicBarrier(threads.size() + 1); 
    for(final T thread : threads){ 
     executor.submit(new Runnable(){ 
      public void run(){ 
       //it is not a mistake to call run() here 
       thread.run(); 
       barrier.await(); 
      } 
     }); 
    } 
    barrier.await(); 
} 

一旦所有其他人完成從threads最後一個線程將被excuted。

而不是調用Executors.newFixedThreadPool(requireddata.size);,最好重用一些現有的線程池。

4楼
0
0

由於您正在等待所有線程完成,然後您提供了響應,所以如果您僅使用CPU週期,IMO多線程將無法提供幫助。它只會通過在線程中添加上下文切換延遲來增加響應時間。單線程會更好。但是如果涉及到網絡/ IO等,你可以利用線程池。

但是你想重新考慮你的方法。在http請求中同步處理大量數據不可取。對於最終用戶來說不是一個好的體驗。你可以做的是啓動一個線程來處理數據,並提供一個「正在處理」的響應。您可以向網絡用戶提供某種形式的手勢,以隨時檢查狀態。

0
votes
answers
39 views
+10

在使用tomcat server.xml或web.xml創建新日誌之前備份日誌文件

-1

我正在研究將信息和錯誤記錄器作爲日誌供我們參考的文本文件寫入的Java應用程序。該文件正在大幅增長,所以我需要檢查文件的大小...例如,如果文件大小超過10 Mb,我必須創建另一個文件。在使用tomcat server.xml或web.xml創建新日誌之前備份日誌文件

像這樣,我必須創建10個文件,一個接一個地旋轉,直到10個文件。達到10個文件後,我必須刪除開始文件並重新開始創建...

如何刪除文件後的否。的文件將成爲10?

此操作的主要限制是試圖在不使用log4j或logback庫的情況下完成要求。

Logging.properties

1catalina.org.apache.juli.AsyncFileHandler.level = FINE 
1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs 
1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina. 

2localhost.org.apache.juli.AsyncFileHandler.level = FINE 
2localhost.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs 
2localhost.org.apache.juli.AsyncFileHandler.prefix = localhost. 

3manager.org.apache.juli.AsyncFileHandler.level = FINE 
3manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs 
3manager.org.apache.juli.AsyncFileHandler.prefix = manager. 

4host-manager.org.apache.juli.AsyncFileHandler.level = FINE 
4host-manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs 
4host-manager.org.apache.juli.AsyncFileHandler.prefix = host-manager. 

java.util.logging.ConsoleHandler.level = FINE 
java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter 


############################################################ 
# Facility specific properties. 
# Provides extra control for each logger. 
############################################################ 

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO 
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.org.apache.juli.AsyncFileHandler 

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO 
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = 3manager.org.apache.juli.AsyncFileHandler 

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].level = INFO 
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].handlers = 4host-manager.org.apache.juli.AsyncFileHandler 
+0

您是否在使用第三方API(如log4j)? – Ele

+0

即使你不想使用log4j,你也可以看看它的源代碼:http://grepcode.com/file/repo1.maven.org/maven2/log4j/log4j/1.2.15/org/apache/ log4j/RollingFileAppender.java – StephaneM

+0

包含一些日誌代碼和/或配置文件。 – jmehrens

沙发
0
0

鑑於你的限制,你可以使用java.util.logging.FileHandler代替org.apache.juli.AsyncFileHandler

1catalina.org.apache.juli.AsyncFileHandler.level = FINE 
1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs 
1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina. 

2localhost.java.util.logging.FileHandler.level = FINE 
2localhost.java.util.logging.FileHandler.limit = 10000000 
2localhost.java.util.logging.FileHandler.count = 10 
2localhost.java.util.logging.FileHandler.pattern = ${catalina.base}/logs/localhost%g.log 

3manager.org.apache.juli.AsyncFileHandler.level = FINE 
3manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs 
3manager.org.apache.juli.AsyncFileHandler.prefix = manager. 

4host-manager.org.apache.juli.AsyncFileHandler.level = FINE 
4host-manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs 
4host-manager.org.apache.juli.AsyncFileHandler.prefix = host-manager. 

java.util.logging.ConsoleHandler.level = FINE 
java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter 


############################################################ 
# Facility specific properties. 
# Provides extra control for each logger. 
############################################################ 

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO 
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.org.apache.juli.AsyncFileHandler 

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO 
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = 3manager.org.apache.juli.AsyncFileHandler 

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].level = INFO 
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].handlers = 4host-manager.org.apache.juli.AsyncFileHandler 

你必須modify的logging.properties這樣你就可以安裝JUL的FileHandler。

0
votes
answers
45 views
+10

如何在Tomcat上以root身份部署戰爭之外的靜態內容8

0

我有一個docker容器 - Tomcat應用程序(war文件),它的靜態內容包含在war文件中。但是爲了開發目的,我想將靜態內容移出war文件並將其映射到文件系統上的文件夾。這樣做的原因很簡單。例如,我不希望每次改變javascript文件時重新部署。我想在瀏覽器中重新加載頁面,並將所做的更改提取出來。 Tomcat的版本是8如何在Tomcat上以root身份部署戰爭之外的靜態內容8

最常見的解決了這個問題(如果你google一下)是改變server.xml文件和類似的片段添加到此之一:

<Context docBase="/my/static/content/folder" path="/some/context" /> 

不過,我想將靜態內容映射到我的應用程序的根文件夾。說我的戰爭文件名是myapp.war。它被部署在「/ myapp」下。問題是,如果我想添加靜態內容從根開始,然後我的上下文片段看起來是這樣的:

<Context docBase="/my/static/content/folder" path="/myapp" /> 

這是不正確,因爲該路徑必須是唯一的,「MYAPP」不能既使用 - 自動部署使用war文件名來派生上下文以及上面的上下文片段。我可以改變路徑來指向「myapp/static」,但是我需要將更改應用到我想要避免的源代碼。

想法如何將外部文件夾映射到我的應用程序根目錄是非常值得歡迎的。

+0

你爲什麼不用另一個碼頭圖像創建一個例如nginx httpd,提供來自該映像的開發靜態內容並將nginx配置爲您的tomcat docker映像的反向代理? – saw303

+0

目前我寧願保持設置儘可能簡單。我也可以使用Apache Web服務器來提供靜態內容,但我暫時不想再引入其他服務器。感謝提示。 – Flexer

沙发
0
0

,並回答我的問題...... 背景標籤應該是這樣的:

該解決方案的
<Context path="/myapp" docBase="myapp.war"> 
    <Resources className="org.apache.catalina.webresources.StandardRoot"> 
     <PreResources className="org.apache.catalina.webresources.DirResourceSet" 
      base="/my/static/content/folder" 
      webAppMount="/"> 
     </PreResources> 
    </Resources> 
</Context> 

一個令人不快的副作用是,雖然我的服務器的啓動時間從上升?22秒?52秒。 我的「/我的/靜態/內容/文件夾」有97個項目,其大小爲13.7MB。

反饋如何改善這種情況,或者歡迎使用沒有如此大的啓動時間的替代解決方案。

更新: 從PreResources切換到PostResources解決了啓動問題。它從?52秒回到?26秒。現在開銷只有4秒,這對我來說已經足夠了。

更新2:在我原來的文章中,我提到Context標籤應該添加到server.xml。這可以工作,但更好和更簡潔的方式來添加它是通過創建一個context.xml文件並將它放在WAR文件中的META-INF下。這樣,只有WAR文件和服務器(分別是Docker鏡像)的更改是相同的,無論是否用於開發。

0
votes
answers
65 views
+10

爲什麼java.lang.NoSuchMethodError出現非常特定於環境或類加載器?

0

我目前正在開發一個項目,其中包含log4j-over-slf4j.jar文件。在所有的環境中,這個罐子都在工作。但突然間我有一臺WebSphere應用程序服務器。 我們的產品在tomcat服務器上工作,突然之間,我們的應用程序無法創建任何日誌,而在另一個環境中創建它。如果我嘗試從項目中刪除該jar,那麼我可以生成日誌。爲什麼java.lang.NoSuchMethodError出現非常特定於環境或類加載器?

但我無法確定爲什麼我應該只爲特定的環境做這件事。

或者我應該怎麼做才能在服務器運行時識別類加載器信息以確定哪個類被加載或哪個方法被加載?

我的JDK版本是: 「1.7.0_71」

我的應用程序中包含這些庫:

antlr-2.7.7.jar 
aopalliance-1.0.jar 
asm-1.5.3.jar 
asm-attrs-1.5.3.jar 
axiom-api-1.2.12.jar 
axiom-impl-1.2.12.jar 
axis2-1.6.2.jar 
axis2-kernel-1.6.1.jar 
axis2-transport-http-1.6.1.jar 
axis2-transport-local-1.6.1.jar 
c3p0-0.9.2.1.jar 
cglib-2.1_3.jar 
com.ibm.jbatch-tck-spi-1.0.jar 
commons-codec-1.6.jar 
commons-collections-3.1.jar 
commons-fileupload-1.2.jar 
commons-httpclient-3.1.jar 
commons-logging-1.1.3.jar 
dom4j-1.6.1.jar 
ehcache-1.2.3.jar 
geronimo-activation_1.1_spec-1.0.2.jar 
geronimo-javamail_1.4_spec-1.6.jar 
geronimo-jta_1.1_spec-1.1.jar 
geronimo-stax-api_1.0_spec-1.0.1.jar 
geronimo-ws-metadata_2.0_spec-1.1.2.jar 
hibernate-3.2.4.ga.jar 
hibernate-annotations-3.3.0.ga.jar 
hibernate-commons-annotations-3.1.0.GA.jar 
hibernate-core-3.3.0.CR2.jar 
hibernate-ehcache-3.3.0.CR2.jar 
hibernate-entitymanager-3.3.1.ga.jar 
hibernate-jpa-2.0-api-1.0.0.Final.jar 
hibernate-validator-3.1.0.CR2.jar 
httpcore-4.0.jar 
javaetmoi-spring4-vfs2-support-1.4.0.jar 
javassist-3.18.1-GA.jar 
javassist-3.3.GA.jar 
javax.batch-api-1.0.jar 
javax.servlet-api-3.0.1.jar 
jaxen-1.1.1.jar 
jboss-common-core-2.0.4.GA.jar 
jboss-logging-3.3.0.Final.jar 
jettison-1.2.jar 
jsr311-api-1.0.jar 
jta-1.1.jar 
log4j-1.2.17.jar 
log4j-api-2.0.jar 
logkit-1.0.1.jar 
mchange-commons-java-0.2.3.4.jar 
neethi-3.0.1.jar 
oracle-ojdbc6-11.2.0.3.0.jar 
persistence-api-1.0.jar 
poi-3.9.jar 
slf4j-api-1.7.11.jar 
slf4j-simple-1.6.4.jar 
spring-aop-3.2.13.RELEASE.jar 
spring-batch-core-3.0.1.RELEASE.jar 
spring-batch-infrastructure-3.0.1.RELEASE.jar 
spring-beans-3.2.13.RELEASE.jar 
spring-context-3.2.13.RELEASE.jar 
spring-core-3.2.13.RELEASE.jar 
spring-expression-3.2.13.RELEASE.jar 
spring-jdbc-3.2.13.RELEASE.jar 
spring-orm-3.2.13.RELEASE.jar 
spring-retry-1.0.3.RELEASE.jar 
spring-tx-3.2.13.RELEASE.jar 
spring-web-4.0.3.RELEASE.jar 
stax-api-1.0.1.jar 
woden-api-1.0M9.jar 
woden-impl-commons-1.0M9.jar 
woden-impl-dom-1.0M9.jar 
wsdl4j-1.6.2.jar 
wstx-asl-3.2.9.jar 
xmlbeans-2.5.0.jar 
xmlpull-1.1.3.1.jar 
XmlSchema-1.4.7.jar 
xpp3_min-1.1.4c.jar 
xstream-1.4.7.jar 

我的Tomcat的lib目錄包含:

annotations-api.jar 
catalina-ant.jar 
catalina-ha.jar 
catalina.jar 
catalina-storeconfig.jar 
catalina-tribes.jar 
ecj-4.5.jar 
el-api.jar 
jasper-el.jar 
jasper.jar 
jsp-api.jar 
ojdbc6-11.2.0.3.jar 
servlet-api.jar 
sqljdbc4-11.1.0.7.0.jar 
tomcat-api.jar 
tomcat-coyote.jar 
tomcat-dbcp.jar 
tomcat-i18n-es.jar 
tomcat-i18n-fr.jar 
tomcat-i18n-ja.jar 
tomcat-jdbc.jar 
tomcat-jni.jar 
tomcat-juli.jar 
tomcat-util.jar 
tomcat-util-scan.jar 
tomcat-websocket.jar 
websocket-api.jar 
沙发
0
0

不能確定準確的環境,但我幾乎可以肯定你會得到一些類庫的意外版本。如果在從Tomcat切換到WebSphere(或其他方式)之後發生問題,他們可能有不同版本的與slf4相關的東西(或其中一個庫有另一個缺失的庫)。大多數情況下,java的-verbose:class選項應該可用於挖掘從何處獲得類的內容

板凳
0
0

當您的代碼使用不同於您的環境提供的代碼版本進行編譯時,會出現此類錯誤。

public class A{ 
public void a(){ 
} 
} 

//newer version of module 
public class AVariant{ 
public void a(String b){ 
} 
} 

我沒那麼熟悉WebSphere,但這裏的問題是,WebSphere使用日誌框架的舊/更新或版本,這是不兼容你編譯應用程序的版本。您需要解決此依賴性衝突。

本指南可以幫助你:當你的應用程序試圖調用一個方法在早期版本的類,這是不可用的類的較新版本的情況 https://www.slf4j.org/legacy.html

+0

感謝您的回答,我們知道NoSuchMethodError如何發生,但我的問題是爲什麼我們必須刪除該jar。 – 5A9U

地板
0
0

NoSuchMethod錯誤。基本上這可能是由於升級/降級或進入新環境時版本衝突造成的。

的深入描述在這裏。

Docker Image of Jersey Web Application

檢查應用程序庫VS服務器提供的庫不會是在這裏使用。重要的是JVM類加載器在運行時加載的庫/類。

分析哪些是通過java.class.path系統屬性加載的類https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html

System.getProperty("java.class.path"); 

然後將它們與你的Tomcat版本提供的罐子進行比較。

+0

類路徑中沒有任何變化。它仍然是一樣的。我們在默認情況下在tomcat的classpath中使用了bootstrap.jar和tomcat-juli.jar。 – 5A9U

+0

你能發佈錯誤日誌嗎? –