GWT Eclipse:使用来自其他项目的 classes 导致“服务器 class ... 在 Web 应用程序中找不到,但在系统 class 路径上找到
GWT Eclipse: using classes from other projects cause "Server class ... could not be found in the web app, but was found on the system classpath
我是使用 GWT 进行开发的新手。我开始维护一个 GWT (2.7) 应用程序,需要修改日志记录。所以我决定利用 MDC (MappedDiagnosticContext) 并编写一个 servlet Filter 将用户名放入 MDC,如下所示:
public class MDCServletFilter implements Filter {
/* (non-Javadoc)
* @see javax.servlet.Filter#destroy()
*/
public void destroy() {}
/* (non-Javadoc)
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
*/
public void doFilter(ServletRequest aRequest, ServletResponse aResponse, FilterChain aFilterChain)
throws IOException, ServletException {
try {
// get the session from the request ...
HttpServletRequest tempRequest = (HttpServletRequest)aRequest;
HttpSession tempSession = tempRequest.getSession();
// get the currently logged in user ...
String tempUser = (String)tempSession.getAttribute(Authorizer.USER_KEY);
// if user is logged in, put the name into the MDC ...
if (tempUser != null && tempUser.trim().length() > 0) {
MDC.put(Authorizer.USER_KEY, tempUser);
}
// at least call the other filter ..
aFilterChain.doFilter(tempRequest, aResponse);
} finally {
// finally remove the user name from the MDC ...
MDC.remove(Authorizer.USER_KEY);
}
}
/* (non-Javadoc)
* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
*/
public void init(FilterConfig arg0) throws ServletException {}
}
web.xml:
<web-app>
<!-- MDC Filter -->
<filter>
<filter-name>MDCServletFilter</filter-name>
<filter-class>
foo.bar.filter.MDCServletFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>MDCServletFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- MDC Filter END -->
现在,当我在 eclipse 中启动应用程序时(6 月),我收到警告:
[WARN] Server class 'foo.bar.filter.MDCServletFilter' could not be found in the web app, but was found on the system classpath
过滤器 class 驻留在 "common" 项目中,而不是 GWT 项目中,因为我们有更多的 GWT 项目使用一些常见的 classes。如果我将过滤器 class 放入 GWT 项目中,则不会出现警告。
那么,我该如何设置 GWT 项目才能在没有任何警告的情况下使用其他项目的 classes?
提前致谢!
详细信息取决于您的构建工具 and/or IDE,但目标是让所有服务器端 类 在 webapp 的 WEB-INF
中(或者在 WEB-INF/classes
,这可能是您的 GWT 项目的情况,或者在 WEB-INF/lib
).
中的 JAR 中
无论如何,在将 webapp 部署到 servlet 容器时这都是必需的(除非您打算将 "common" 项目部署为 servlet 容器中的共享库)。
我通过将普通项目的源文件夹链接到GWT项目中解决了:
GWT 项目的属性 -> JavaBuild 路径 -> "Link source..." ->
将 "Linked folder location:" 设置为 "WORKSPACE_LOC/someSecondProject/src",然后将 "Folder name:" 从 "src" 重命名为例如"CommonGWT.src".
此设置将其他项目的所有源编译成GWT项目的"WEB-INF/classes",Eclipse GWT满足。
我是使用 GWT 进行开发的新手。我开始维护一个 GWT (2.7) 应用程序,需要修改日志记录。所以我决定利用 MDC (MappedDiagnosticContext) 并编写一个 servlet Filter 将用户名放入 MDC,如下所示:
public class MDCServletFilter implements Filter {
/* (non-Javadoc)
* @see javax.servlet.Filter#destroy()
*/
public void destroy() {}
/* (non-Javadoc)
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
*/
public void doFilter(ServletRequest aRequest, ServletResponse aResponse, FilterChain aFilterChain)
throws IOException, ServletException {
try {
// get the session from the request ...
HttpServletRequest tempRequest = (HttpServletRequest)aRequest;
HttpSession tempSession = tempRequest.getSession();
// get the currently logged in user ...
String tempUser = (String)tempSession.getAttribute(Authorizer.USER_KEY);
// if user is logged in, put the name into the MDC ...
if (tempUser != null && tempUser.trim().length() > 0) {
MDC.put(Authorizer.USER_KEY, tempUser);
}
// at least call the other filter ..
aFilterChain.doFilter(tempRequest, aResponse);
} finally {
// finally remove the user name from the MDC ...
MDC.remove(Authorizer.USER_KEY);
}
}
/* (non-Javadoc)
* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
*/
public void init(FilterConfig arg0) throws ServletException {}
}
web.xml:
<web-app>
<!-- MDC Filter -->
<filter>
<filter-name>MDCServletFilter</filter-name>
<filter-class>
foo.bar.filter.MDCServletFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>MDCServletFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- MDC Filter END -->
现在,当我在 eclipse 中启动应用程序时(6 月),我收到警告:
[WARN] Server class 'foo.bar.filter.MDCServletFilter' could not be found in the web app, but was found on the system classpath
过滤器 class 驻留在 "common" 项目中,而不是 GWT 项目中,因为我们有更多的 GWT 项目使用一些常见的 classes。如果我将过滤器 class 放入 GWT 项目中,则不会出现警告。
那么,我该如何设置 GWT 项目才能在没有任何警告的情况下使用其他项目的 classes?
提前致谢!
详细信息取决于您的构建工具 and/or IDE,但目标是让所有服务器端 类 在 webapp 的 WEB-INF
中(或者在 WEB-INF/classes
,这可能是您的 GWT 项目的情况,或者在 WEB-INF/lib
).
无论如何,在将 webapp 部署到 servlet 容器时这都是必需的(除非您打算将 "common" 项目部署为 servlet 容器中的共享库)。
我通过将普通项目的源文件夹链接到GWT项目中解决了:
GWT 项目的属性 -> JavaBuild 路径 -> "Link source..." ->
将 "Linked folder location:" 设置为 "WORKSPACE_LOC/someSecondProject/src",然后将 "Folder name:" 从 "src" 重命名为例如"CommonGWT.src".
此设置将其他项目的所有源编译成GWT项目的"WEB-INF/classes",Eclipse GWT满足。