【问题标题】:How do you programatically 'relative import' a directory of jar files?您如何以编程方式“相对导入”jar 文件目录?
【发布时间】:2012-01-20 06:07:38
【问题描述】:

我正在使用 Drools Planner,它在 binaries 目录中附带了 21 个 Jar 文件。例如 drools-core-5.3.0.Final.jar 将提供 org.drools.someClasses

包含的示例通过运行一个包罗万象的命令在命令行中运行它:

mainClasspath=
for i in binaries/*.jar; do mainClasspath=${mainClasspath}:$i; done

mainClass=org.drools.planner.examples.app.DroolsPlannerExamplesApp
$JAVA_HOME/bin/java -Xms256m -Xmx512m -server -cp ${mainClasspath} ${mainClass} $*

我正在命令行中开发程序。但是最终的应用程序(它只是添加了一个 HTTP 接口)在 JSP 容器中运行,而不是从命令行运行。因此,我需要以编程方式将 jar 文件导入到我的项目中。

问题:如何以编程方式导入 jar 文件?

我宁愿必须在环境变量中指定binaries 路径吗?


更新

我这样做是为了告诉 Java 在全局范围内,可能会在同一目录中找到额外的类,即 ./home/jesvin/dev/drools/binaries。请注意,: 是 Linux 中的分隔符。

declare -x CLASSPATH='.:/home/jesvin/dev/drools/binaries' 

您可以按照Miserable Variable's answer 为每个执行实例执行此操作。

最后,在 Tomcat 部署中,我给它一个 HTTP 接口,按照havexz's answer 进行部署。

【问题讨论】:

  • 你的服务器是什么,比如tomcat、jboss等?它的版本是什么?因为 soln 会因服务器而异。
  • Tomcat 6. 但是我想先在命令行上试试这个方法
  • 您必须首先在命令行中运行它到底是什么意思?您不需要以编程方式在您的 java 代码中导入 jars。
  • @aitchnyu 您的问题似乎已经有办法从命令行执行此操作,您甚至说“我将这个项目作为 JSP 运行,而不是从命令行运行”暗示您想要一个非命令行解决方案,但是您说您“想先在命令行上尝试该方法”。是哪个?
  • 我希望原型应用程序在命令行中工作以进行测试。然后我正在编写一个导入原型应用程序的JSP 应用程序(我用它来提供一个方便的HTTP 接口)。抱歉,我对以前的 cmets 不太清楚。

标签: java jar tomcat6


【解决方案1】:

如果 jars 需要在全局范围内:

如果您希望服务器上的所有应用都可以使用这些 jar,请尝试将它们放入

`<tomcat_install_dir>/lib`

编辑: @Geoffery 评论:如果您有权访问

<tomcat_install_di>/conf/catalina.properties

然后您可以添加自己的常用 jar 目录,例如:

common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar,${catalina.base}/your_common_jar_folder/*.jar

(仔细看最后,我已经添加了一个新文件夹)

但无论哪种方式,如果 jar 是在全局范围内,它们应该位于上述任何文件夹中。否则,您必须在每个应用程序中放置其他常用的 jar 来进行日志记录和 jdbc 等。

如果 jar 需要在应用范围内

如果您希望这些 jar 仅用于一个特定的应用程序,则将它们放入

`<your_web_app>/WEB-INF/lib`

注意:您可以将 &lt;your_web_app&gt;/WEB-INF/lib 放在您的开发文件夹中,如果您使用正确的工具,那么它将使这些 jar 成为您的 .war 文件的一部分。

旁注:由于您也在从命令行运行 java 程序并且在添加依赖项 jar 时遇到问题。有时间回来I wrote a shell script为此目的,希望这对你也有帮助。

它的小sn-p:

Run Java easily from shell command

Usage: easyrunjava [-c <jar_name/jar_dir>,<jar_name/jar_dir>...] [-m <email_id1>,<email_id2>...] [-p <prop_file1>,<prop_file2>...] class_name [args_to_program]

Example:
`easyrunjava -p .,./dependency -m user.name@xyz.com com.example.HelloWorld`

【讨论】:

  • 你不应该和&lt;tomcat_install_dir&gt;/lib搞混。只需将二进制文件夹中的罐子放在yourWarFile.war/WEB-INF/lib 中。或者更好的是,使用maven 3 或 gradle 为您构建战争。
  • @GeoffreyDeSmet 好吧,我添加了更多高级选项,但就您而言,全局范围内的 jar 必须是全局可访问的,否则您最终会为每个应用程序部署通用 jar。
【解决方案2】:

您是否尝试将所有 jar 放入类路径中的文件夹中?那么import 是错误的词。

较新版本的 java 允许 '*' 作为类路径:

$JAVA_HOME/bin/java -Xms256m -Xmx512m -server -cp 'binaries/*' ${mainClass} $*

应该可以。注意binaries/* 用单引号括起来以防止外壳扩展。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2012-03-08
    • 2010-12-15
    相关资源
    最近更新 更多