我该如何将JAR包放置在Jetty/lib中并添加到Jetty的类路径中?

8

我有Jetty jetty-9.2.3.v20140905。

我的理解是,lib/jar或lib/ext中的jars会自动出现在类路径上,但这可能是jetty 8的旧行为。

我正在尝试部署具有websockets的webapp。将我的部署的WAR文件放置在webapps目录中后,jetty一直抱怨找不到坐落在jetty/lib目录中的jars(jetty-http、jetty-io、jetty-security、jetty-server、jetty-servlet、jetty-util是我的webapp需要但无法找到的那些)。

当我执行--module-ext时,也不会选择放置在lib/ext中的jars。

如何解决这个问题?

编辑原始问题以回答下面的答案,我已经尝试启用服务器模块,其server.mod文件包含以下行:

[lib]
lib/servlet-api-3.1.jar
lib/jetty-schemas-3.1.jar
lib/jetty-http-${jetty.version}.jar
lib/jetty-server-${jetty.version}.jar
lib/jetty-xml-${jetty.version}.jar
lib/jetty-util-${jetty.version}.jar
lib/jetty-io-${jetty.version}.jar

从命令行中,我执行以下操作:
java -jar start.jar --module=server jetty.port=8182

结果是:
2014-10-30 15:26:13.907:WARN:oejuc.AbstractLifeCycle:main: FAILED   
org.eclipse.jetty.annotations.ServletContainerInitializersStarter@2635068e: 
java.lang.NoClassDefFoundError: org/eclipse/jetty/server/Handler
java.lang.NoClassDefFoundError: org/eclipse/jetty/server/Handler

org.eclipse.jetty.server.Handler就在我的jetty/lib目录下的jetty-server jar包中。

也许jetty.version或jetty.base变量设置不正确?

当我执行一个

--list-classpath

我看到了lib目录中的所有jar文件。

1个回答

9

您正在阅读哪些文档?(请提供链接)

start.config 的整个概念只存在于 Jetty 8 及更早版本中。

当前的文档可以在 http://www.eclipse.org/jetty/documentation/current/ 找到。

该文本不适用于 Jetty 9.2.3.v20140905

从 lib/ 中同时将所有 jar 文件添加到服务器类路径中是没有好处的。实际上,这会导致一个无效的环境,因为有多个核心技术(如 jsp、jstl 和 javax.el)的不同实现可以进行更改。此外,在 lib/ 中还存在需要第三方可选库才能运行的库(例如 npn、alpn),在下载之前需要您确认许可证。

从 {jetty.home}/lib 或 {jetty.base}/lib 中加载的库由您在 jetty 实例配置中启用了哪些模块来确定。

要了解启动、start.jar、命令行、模块、libs、xml 配置、配置属性、{jetty.base}、{jetty-dir} 和 {jetty.home},请参阅 “Startup Documentation”: http://www.eclipse.org/jetty/documentation/current/startup.html

要回答您有关启动 jetty 和 webapps 的具体问题。 (同样的内容在上面 URL 中的 “Startup Documentation” 文档中有详细介绍)

这是一个快速示例,使用 {jetty.home} 本身(不再推荐,但可以使用):

# Unpack the distribution
[~]$ unzip jetty-distribution-9.2.3.v20140905
[~]$ cd jetty-distribution-9.2.3.v20140905

# Copy your war into place
[jetty-distribution-9.2.3.v20140905]$ cp ~/Projects/mywebapp.war webapps/

# Run Jetty
[jetty-distribution-9.2.3.v20140905]$ java -jar start.jar

现在,我们来介绍更为适当的方法,使用{jetty.base}
# Unpack the distribution
[~]$ unzip jetty-distribution-9.2.3.v20140905

# Make a {jetty.base} directory to house your configuration
[~]$ mkdir myappbase
[~]$ cd myappbase

# Since this is a new {jetty.base}, lets initialize it
[myappbase]$ java -jar ../jetty-distribution-9.2.3.v20140905/start.jar \
  --add-to-start=http,logging,deploy,jsp,ext,resources
INFO: http            initialised in ${jetty.base}/start.ini (appended)
INFO: server          initialised in ${jetty.base}/start.ini (appended)
INFO: logging         initialised in ${jetty.base}/start.ini (appended)
MKDIR: ${jetty.base}/logs
INFO: deploy          initialised in ${jetty.base}/start.ini (appended)
MKDIR: ${jetty.base}/webapps
...(snip)...
MKDIR: ${jetty.base}/lib
MKDIR: ${jetty.base}/lib/ext
INFO: resources       initialised in ${jetty.base}/start.ini (appended)
MKDIR: ${jetty.base}/resources

# Lets see what we have now
[myappbase]$ ls -F
lib/  logs/  resources/  start.ini  webapps/

# Copy your webapp into place
[myappbase]$ cp ~/Projects/mywebapp.war webapps/

# Run Jetty
[myappbase]$ java -jar ../jetty-distribution-9.2.3.v20140905/start.jar

我猜那段文本来自Jetty 8。 - user2197116
我猜那段文字是来自Jetty 8。现在jetty.home/lib中的所有内容都不再在类路径上了吗?如果我想让jetty.home/lib目录中的每个lib都在类路径上,我需要做什么?阅读文档后,我将lib中的所有内容复制到ext中,并在启动jetty时从命令行执行--module=ext,但这并没有起作用。我还尝试了--module=http和--module=server,但都没有任何效果。如果我尝试使用这些jar文件中的类,jetty无法加载war文件,说找不到这些类。 - user2197116
1
没有什么好的理由让{jetty.home}/lib/下的所有 jar 包都在服务器类路径中。而且强制这样做也没有任何意义。请更新你的问题,更具体地说明你想要达到什么目标,比如“我想部署一个带有 JSP 和 WebSockets 的 Web 应用程序”。 - Joakim Erdfelt
感谢您提供详细的解释。然而,无论我是否修改jetty.home start.ini以包含--module=server,或者按照您上面描述的方式创建自己的应用程序特定的jetty部署并在那里初始化服务器作为一个模块,甚至只是尝试通过命令行添加服务器模块,它总是失败的,并显示java.lang.ClassNotFoundException: org.eclipse.jetty.server.Handler。我可以看到org.eclipse.jetty.server.Handler.class就在jetty-server-9.2.3.v20140905.jar中,而且在server.mod中它列出了[lib]部分中的lib/jetty-server-${jetty.version}.jar。 - user2197116
1
该条消息的唯一原因是您自己的WebApp正在使用org.eclipse.jetty.server.Handler(而它不能这样做)。 - Joakim Erdfelt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接