【问题标题】:Embedded Tomcat 7.0.32 startup jar scanner嵌入式 Tomcat 7.0.32 启动 jar 扫描器
【发布时间】:2012-10-25 08:29:13
【问题描述】:

我将 Tomcat 7.0.32 嵌入到 Flume Source 中。我遇到的问题是 Flume 在 Classpath 上放置了很多东西,并且在启动时,Tomcat 会扫描 classpath 以查找 TLD,这会导致问题,因为 flume 使用了通配符。

信息:启动 Servlet 引擎:Apache Tomcat/7.0.32 2012 年 11 月 5 日上午 8:21:08 org.apache.catalina.startup.TldConfig tldScanJar 警告:无法处理 TLD 文件的 JAR [jar:file:/opt/mapr/hadoop/hadoop-0.20.2/hadoop*core*.jar!/] java.io.FileNotFoundException: /opt/mapr/hadoop/hadoop-0.20.2/hadoop*core*.jar (没有这样的文件或目录) 在 java.util.zip.ZipFile.open(本机方法) 在 java.util.zip.ZipFile.(ZipFile.java:214) 在 java.util.zip.ZipFile.(ZipFile.java:144) 在 java.util.jar.JarFile.(JarFile.java:152) 在 java.util.jar.JarFile.(JarFile.java:89) 在 sun.net.www.protocol.jar.URLJarFile.(URLJarFile.java:93) 在 sun.net.www.protocol.jar.URLJarFile.getJarFile(URLJarFile.java:69) 在 sun.net.www.protocol.jar.JarFileFactory.get(JarFileFactory.java:88) 在 sun.net.www.protocol.jar.JarURLConnection.connect(JarURLConnection.java:122) 在 sun.net.www.protocol.jar.JarURLConnection.getJarFile(JarURLConnection.java:89) 在 org.apache.tomcat.util.scan.FileUrlJar.(FileUrlJar.java:41) 在 org.apache.tomcat.util.scan.JarFactory.newInstance(JarFactory.java:34) 在 org.apache.catalina.startup.TldConfig.tldScanJar(TldConfig.java:487) 在 org.apache.catalina.startup.TldConfig.access$100(TldConfig.java:58) 在 org.apache.catalina.startup.TldConfig$TldJarScannerCallback.scan(TldConfig.java:303) 在 org.apache.tomcat.util.scan.StandardJarScanner.process(StandardJarScanner.java:241) 在 org.apache.tomcat.util.scan.StandardJarScanner.scan(StandardJarScanner.java:204) 在 org.apache.catalina.startup.TldConfig.execute(TldConfig.java:277)

在我的代码中,我尝试禁用此扫描,甚至尝试在我的上下文中将 JarScanner 设置为 null。这无济于事。以下是我的代码:

File docBase = new File(System.getProperty("java.io.tmpdir"));
    System.out.println("------- " + docBase.getAbsolutePath());

    String servletName = "1 source";

    Tomcat tomcat = new Tomcat();
    tomcat.setPort(8080);
    tomcat.setBaseDir(docBase.getAbsolutePath());

    Context context = tomcat.addContext("", docBase.getAbsolutePath());
    context.setIgnoreAnnotations(true);
    context.setJarScanner(null);

    Tomcat.addServlet(context, servletName, new HttpServlet() {

【问题讨论】:

    标签: tomcat flume


    【解决方案1】:

    试试这个! 上下文上下文 = tomcat.addWebapp("/d", "d:/"); JarScanner jarScanner = 新的 JarScanner() {

            @Override
            public void scan(ServletContext arg0, ClassLoader arg1,
                    JarScannerCallback arg2, Set<String> arg3)
            {
                //do nothing
            }
        };
        context.setJarScanner(jarScanner);
    

    【讨论】:

      【解决方案2】:

      你可以在 tomcat.addWebapp() 之前禁用扫描类路径和清单:

      ContextConfig contextConfig = new ContextConfig() {
                  private boolean invoked = false;
      
                  @Override
                  public void lifecycleEvent(LifecycleEvent event) {
                      if (!invoked) {
                          StandardJarScanner scanner = new StandardJarScanner();
                          scanner.setScanClassPath(false);
                          scanner.setScanManifest(false);
                          ((Context) event.getLifecycle()).setJarScanner(scanner);
                          invoked = true;
                      }
                      super.lifecycleEvent(event);
                  }
              };
              Context ctx = tomcat.addWebapp(tomcat.getHost(), "/", "path/to/war", contextConfig);
      

      【讨论】:

        【解决方案3】:

        其他两个答案不适用于 Tomcat 8.5+。 addWebApp 将 contextconfig 作为字符串。但是您可以使用下面的代码进行选择性扫描。请注意,如果 JarScanner 在 context.xml 中定义,它将优先于代码。一旦你调用了 tomcat.start(),JarScanFilter 就会被回调

                    Context context = tomcat.addWebapp("/"+sApp, location);
                    //Keep in mind that this JarScanFilter will be overwritten by JarScanner that defined in META-INF\context.xml
                    JarScanFilter jarScanFilter = new JarScanFilter() {
        
                        @Override
                        public boolean check(JarScanType jarScanType, String jarName) {
        
                            if(jarName.startsWith("spring")) {
                                System.out.println("JarScanType: "+ jarScanType +" JarName: "+ jarName + " Will Scan: true");
                                return true;
                            }
                            System.out.println("JarScanType: "+ jarScanType +" JarName: "+ jarName + " Will Scan: false");
                            return false;
                        }
                    };
                    context.getJarScanner().setJarScanFilter(jarScanFilter);
        

        【讨论】:

          猜你喜欢
          • 2016-06-25
          • 2017-11-20
          • 2020-02-21
          • 2018-04-22
          • 2020-01-23
          • 1970-01-01
          • 2013-12-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多