我正在使用Tomcat、JDK 8和Netbeans IDE运行一个Web应用程序(使用ANT进行构建,使用IVY进行依赖项管理)。
我目前将需要对JRE可用的JARs
(servlet-api.jar
、jsp-api.jar
、el-api.jar
、tomcat-dbcp.jar
)放置在JAVA_HOME/jre/lib/ext
中。
我正在升级到一个新的JDK版本(JDK 17),它不再有JRE扩展文件夹。我想知道我应该把这些JARs
放在哪里。
根据this post(以及我看到的其他文章),使用依赖管理器并将这些jar添加到类路径中是更好的做法。
我目前使用IVY来管理我的依赖项,并且已经定制了我的ANT构建,以便将运行时依赖项添加到构建的WAR
文件的WEB-INF/lib
文件夹中。
但是,我不需要上面列出的JARs
在运行时对我的应用程序可用,我需要它们对JRE可用。也就是说,我不希望JARs
(servlet-api.jar
等)在我构建的WAR
文件的WEB-INF/lib
中。我该怎么做呢?
我最后的问题是:
1.在我的开发环境中,如何使某些JARs
/相关性可用于Netbeans中的JRE?
1.如何使某些JARs
/依赖项可用于生产环境中使用的已构建WAR文件中的JRE?
1.我说这些JARs
需要对JRE可用,对吗?我看到的所有帖子都讨论了compile-time vs run-time dependencies,但我描述的情况似乎是一个不同类别的依赖关系。这对吗?
1条答案
按热度按时间7kqas0il1#
我目前将需要对JRE可用的JAR(
servlet-api.jar
、jsp-api.jar
、el-api.jar
、tomcat-dbcp.jar
)放置在JAVA_HOME/jre/lib/ext
中。这不是最好的做事方式。请参阅Is putting external jars in the JAVA_HOME/lib/ext directory a bad thing?
请注意,
jre/lib/ext
机制已从较新版本的Java中删除,因此如果您使用较新版本的Java,该机制将不再起作用。(JDK 9中已删除该机制)。但是,我不需要上面列出的JAR在运行时可用于我的应用程序,我需要它们可用于JRE。
为什么?
也就是说,我不希望JAR(
servlet-api.jar
等)在我构建的WAR文件的WEB-INF/lib
中。我该如何做到这一点?为什么不呢?将应用程序所需的依赖项放在
WEB-INF/lib
中是Java Web应用程序中的正常做法。为什么要用非标准的方式来做呢?但是:某些JAR文件(如
servlet-api.jar
,jsp-api.jar
和el-api.jar
)不应包含在应用程序中。这些JAR文件定义了标准的Java EE / Jakarta EE API,并将在运行时由部署WAR文件的应用服务器(Tomcat等)提供给应用程序。您可以使用Maven以
provided
范围将这些JAR文件作为依赖项添加,这意味着它们将在编译时使用,但不会打包到应用程序中。我说这些JAR需要对JRE可用,对吗?
不需要,JRE不需要使用这些JAR。包含标准API的JAR文件将在运行时由Java EE / Jakarta EE容器提供。其他JAR文件应包含在
WEB-INF/lib
中的应用程序中。