在Glassfish部署期间,WEB-INF / lib中的JAR库未添加到类路径中

时间:2014-05-29 15:15:16

标签: deployment classpath war glassfish-3

我是Glassfish和Java EE的新手,尽管我已经使用Java几年了。我继承了一个停滞不前的项目,现在我需要再次开始开发。我试图按原样部署Web应用程序,看看哪些有效,哪些需要注意。虽然有很多代码可以实现各种功能,但第一点需要注意的是部署应用程序。

我尝试部署的Web应用程序是MyServer,并打包在WAR存档中。 MyServer中的一个类引用了MyDatabase中的一个类,该类实现了InterfaceOne的接口(MyInterfaces)。 MyServer中的班级也可以直接引用InterfaceOne中的MyInterfacesMyServerMyDatabaseMyInterfaces都是Eclipse中的项目,并使用Maven打包。 MyServer POM文件将MyDatabase列为依赖项,MyDatabase的POM文件列出MyInterfaces作为依赖项。 MyServer POM文件不会将MyInterfaces列为直接依赖,但我不认为这会导致问题。 Eclipse没有在MyServer类中显示任何错误; Eclipse似乎认为Maven依赖项足以定位所有必需的类。

当我通过Admin Web控制台在Glassfish v3.1.2上部署MyServer WAR,然后在~glassfish3/glassfish/domains/MyDomain/logs/server.log中查看日志时遇到以下错误:

  

[#| 2014-05-29T10:06:02.371 + 0100 |严重| glassfish3.1.2 |全球| _ThreadID = 80; _ThreadName =线程2; |找不到类[my / interfaces / InterfaceOne]。加载[class my.server.ControllerOne] |#时出错   [#| 2014-05-29T10:06:02.387 + 0100 | SEVERE | glassfish3.1.2 | global | _ThreadID = 80; _ThreadName = Thread-2; |类[my / interfaces / InterfaceOne]未找到。加载[class my.server.ControllerOne] |#]

时出错

尝试从MyServer加载类时,显示有两个与界面有关的错误。如果我从MyDatabase类中删除InterfaceOne的引用或MyInterfaces的{​​{1}}的直接引用,则上述错误之一会消失(这是预期的并且只是确认该错误与my.server.ControllerOne的{​​{1}}的引用(直接和间接)相关。

包括hereherehere在内的类似问题都提到确保所需的库(InterfaceOneMyInterfaces)位于{{1 my-database.jar应用程序的WAR存档目录。但是,如果我检查生成的my-interfaces.jar WAR存档,那么这些库确实位于WEB-INT/lib目录中。如果我在部署后检查MyServer目录,那么库也在那里。我假设这表明它们已成功从WAR存档中提取并放置在Glassfish服务器上。重点是图书馆绝对存在!

所有我能想到的是,库没有添加到JVM的类路径中,试图加载MyServer的类,但是如果Glassfish尝试加载应用程序的类,那么它也应该首先加载库打包与应用程序不应该?确实是Oracle GlassFish Server应用程序开发指南中的this页面 版本3.1.2表示应用程序的WEB-INF/lib/目录已添加到应用程序的类路径中。

我已经看到其他建议,即Web应用程序所需的库放在~glassfish3/glassfish/domains/MyDomain/applications/MyServer/WEB-INF/lib/目录中。这可能很有效,但我的特定库仅由MyServer应用程序所需,而不是整个WEB-INF/lib/。据我所知,将它们放在我的应用程序的~glassfish3/glassfish/domains/MyDomain/lib/ext/目录中应该是有效的。

在部署过程中,有没有人对MyServerMyDomain库似乎没有添加到类路径有什么想法?更具体地说,是否有人知道为什么在部署期间加载WEB-INF/lib/类时my-database.jar类是不可见的?

my-interfaces.jar' my.interfaces.InterfaceOne内容:

my.server.ControllerOne

MyServer pom.xml

MyServer

MyDatabase pom.xml

web.xml

MyInterfaces pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>MyServer</display-name>
  <welcome-file-list>
    <welcome-file>index.xhtml</welcome-file>
    <welcome-file>default.xhtml</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
  </servlet-mapping>
  <context-param>
    <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
  </context-param>
  <context-param>
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
    <param-value>resources.application</param-value>
  </context-param>
  <context-param>
    <param-name>javax.faces.FACELETS_LIBRARIES</param-name>
    <param-value>/WEB-INF/balusc.taglib.xml</param-value>
  </context-param>
  <context-param>
    <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
    <param-value>true</param-value>
  </context-param>
  <filter>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
  </filter-mapping>
  <context-param>
    <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
    <param-value>false</param-value>
  </context-param>
</web-app>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>my.webapp</groupId> <artifactId>my-server</artifactId> <version>0.1.0-SNAPSHOT</version> <name>My Server</name> <parent> <groupId>my.webapp</groupId> <artifactId>my-parent-pom</artifactId> <version>1.5</version> </parent> <organization> <name>Example</name> <url>http://www.example.com</url> </organization> <repositories> <repository> <id>eclipselink</id> <url>http://www.eclipse.org/downloads/download.php?r=1&amp;nf=1&amp;file=/rt/eclipselink/maven.repo/</url> </repository> </repositories> <dependencies> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>6.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.faces</groupId> <artifactId>jsf-api</artifactId> <version>2.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.sun.faces</groupId> <artifactId>jsf-impl</artifactId> <version>2.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>eclipselink</groupId> <artifactId>eclipselink</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>utilities</groupId> <artifactId>utilities</artifactId> <version>0.1.0</version> </dependency> <dependency> <groupId>javax.enterprise</groupId> <artifactId>cdi-api</artifactId> <version>1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>my.webapp</groupId> <artifactId>my-database</artifactId> <version>0.1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.primefaces</groupId> <artifactId>primefaces</artifactId> <version>3.4.1</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-io</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.2.1</version> </dependency> </dependencies> <packaging>war</packaging> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <!-- <configuration> section added to pick up the WEB-INF/web.xml inside WebContent --> <configuration> <webResources> <resource> <directory>WebContent</directory> </resource> </webResources> </configuration> </plugin> </plugins> </build> <scm> <connection>scm:svn:https://svn.server/location/in/repo/my_server</connection> <developerConnection>scm:svn:https://svn.server/location/in/repo/my_server/trunk</developerConnection> </scm> </project> POM列出了对<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <artifactId>my-database</artifactId> <version>0.1.0-SNAPSHOT</version> <parent> <groupId>my.webapp</groupId> <artifactId>my-parent-pom</artifactId> <version>1.5</version> </parent> <dependencies> <dependency> <groupId>eclipselink</groupId> <artifactId>eclipselink</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mindrot</groupId> <artifactId>bcrypt</artifactId> <version>0.2.0</version> </dependency> <dependency> <groupId>my.webapp</groupId> <artifactId>my-interfaces</artifactId> <version>0.1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.apache.geronimo.specs</groupId> <artifactId>geronimo-jpa_3.0_spec</artifactId> <version>1.1.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.0.5</version> <scope>test</scope> </dependency> </dependencies> <scm> <connection>scm:svn:https://svn.server/location/in/repo/my_database</connection> <developerConnection>scm:svn:https://svn.server/location/in/repo/my_database/trunk/</developerConnection> </scm> <groupId>my.webapp</groupId> </project> 的依赖关系。我认为这个问题可以安全地忽略,因为它没有一个类出现在我所描述的错误消息中。部署我的应用程序时,它也会放在Glassfish服务器上的<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>my.webapp</groupId> <artifactId>my-interfaces</artifactId> <version>0.1.0-SNAPSHOT</version> <packaging>jar</packaging> <parent> <groupId>my.webapp</groupId> <artifactId>my-parent-pom</artifactId> <version>1.5</version> </parent> <scm> <connection>scm:svn:https://svn.server/location/in/repo/my_interfaces</connection> <developerConnection>scm:svn:https://svn.server/location/in/repo/my_interfaces/trunk</developerConnection> </scm> <dependencies> <dependency> <groupId>my.webapp</groupId> <artifactId>my-utilities</artifactId> <version>0.1.2</version> <classifier>me</classifier> </dependency> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>6.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> </dependencies> </project> 目录中。

(Glassfish问题似乎需要很多信息,比如web.xml文件和pom.xml等。感谢您抽出时间来筛选所有这些。)

2 个答案:

答案 0 :(得分:0)

我已经建立了一个与你所描述的结构基本相同的项目,我无法重现这个问题,也没有其他想法可能出错。

因此,我已将测试项目推送到GitHub,以便您可以尝试,也许您会发现项目中有任何不同之处。

项目在这里:https://github.com/erdbeerschnitzel/war-packaging

如果您没有GitHub帐户来克隆项目,可以下载ZIP(右下角的按钮)。在某处解压缩并在IDE中加载5个项目,构建所有内容并部署 my-server 项目的WAR文件。

我遗漏了父项目,并删除了一些依赖项,如eclipselink和primefaces,但我认为这不应该有所作为。

祝你好运。

更新:

  

Glassfish具有单独的Deploy和Launch操作。我期待部署到   上传,提取WAR并注册需要的任何内容   注册。我希望Launch动作能够实际加载类和   开始进程。我部署时为什么要加载类?

实际上,部署应用程序(以及类)时会加载它。

答案 1 :(得分:0)

似乎有两个问题在起作用:

  1. 首先MyServer's web.xml <display-name>不正确。这个 在我的问题中看不到,因为我改变了库名 (包含客户名称)。部分要求给了我 因为这个项目要重塑这个项目,我错过了 <display-name>元素。糟糕。

  2. 第二个问题是,而 在调查这个问题时,我移动了MyDatabase和。{ 来自MyInterfaces MyServer的{​​{1}}个库 目录到域WEB-INF/lib/目录并返回。这个 更改了部署期间记录的错误(自库以来) 尽管lib/ext/不正确,但仍然可见,但他们错了 当我移动数据库和接口库时,没有再出现 回到<display-name>应用程序。我认为Glassfish正在缓存 库期间没有更新缓存的库 部署。停止/启动域更新了缓存。

  3. 总结一下,一旦更改了MyServer的MyServer并更新了Glassfish库缓存,就会解决类加载错误。