【问题标题】:How to load classes, resources, jars dynamically in java?如何在java中动态加载类、资源、jar?
【发布时间】:2015-10-22 00:34:35
【问题描述】:

这里我们展示了两个项目结构。

  1. 多个项目的第一个
  2. 另一个用于单一项目结构。

我们想要组装由多个项目组成的单个项目。我们的要求是通过 java 程序从不同的位置动态加载它的依赖项,如 classesresourcesjars。无需将类路径条目添加到它的 jar MANIFEST.MF

您可以在运行时添加 java 选项以识别类路径,但我们更喜欢通过 java 程序动态加载。

/opt/java/chorke/multiple/projects/home/
    ├─ bin/
    │   ├─ mspn/
    │   │   ├─ lib/
    │   │   │   ├─ chorke-mspn-utlity-2.0.00-SNAPSHOT.jar
    │   │   │   └─ chorke-mspn-webapp-2.0.00-SNAPSHOT.jar
    │   │   ├─ chorke-mspn-server-2.0.00-SNAPSHOT.jar         [executable jar]
    │   │   ├─ README.md
    │   │   └─ LICENSE
    │   ├─ mllp/
    │   │   ├─ lib/
    │   │   │   ├─ chorke-mllp-utlity-2.0.00-SNAPSHOT.jar
    │   │   │   └─ chorke-mllp-webapp-2.0.00-SNAPSHOT.jar
    │   │   ├─ chorke-mllp-server-2.0.00-SNAPSHOT.jar         [executable jar]
    │   │   ├─ README.md
    │   │   └─ LICENSE
    │   └─ itis/
    │       ├─ lib/
    │       │   ├─ chorke-itis-utlity-2.0.00-SNAPSHOT.jar
    │       │   └─ chorke-itis-webapp-2.0.00-SNAPSHOT.jar
    │       ├─ chorke-itis-server-2.0.00-SNAPSHOT.jar         [executable jar]
    │       ├─ README.md
    │       └─ LICENSE
    ├─ lib/
    │   ├─ commons-lang3-3.3.2.jar
    │   ├─ ...more...hidden...jars...here.jar
    │   ├─ slf4j-log4j12-1.7.12.jar
    ├─ opt/
    │   ├─ org.eclipse.swt.gtk.linux.x86-4.4.2.jar
    │   ├─ org.eclipse.swt.cocoa.macosx.x86-4.4.2.jar
    │   ├─ ...more...optional...hidden...jars...here.jar
    │   └─ org.eclipse.swt.win32.win32.x86_64-4.4.2.jar
    └─ etc/
        ├─ mspn/
        │   ├─ application.properties
        │   ├─ application.yml
        │   └─ log4j.xml
        ├─ mllp/
        │   ├─ application.properties
        │   ├─ application.yml
        │   └─ log4j.xml
        └─ itis/
            ├─ application.properties
            ├─ application.yml
            └─ log4j.xml

在这里,我们将多个项目结构拆分为单个项目,以供您考虑。

/opt/java/chorke/single/project/home/
    ├─ bin/
    │   └─ itis/
    │       ├─ lib/
    │       │   ├─ chorke-itis-utlity-2.0.00-SNAPSHOT.jar
    │       │   └─ chorke-itis-webapp-2.0.00-SNAPSHOT.jar
    │       ├─ chorke-itis-server-2.0.00-SNAPSHOT.jar         [executable jar]
    │       ├─ README.md
    │       └─ LICENSE
    ├─ lib/
    │   ├─ commons-lang3-3.3.2.jar
    │   ├─ ...more...hidden...jars...here.jar
    │   ├─ slf4j-log4j12-1.7.12.jar
    ├─ opt/
    │   ├─ org.eclipse.swt.gtk.linux.x86-4.4.2.jar
    │   ├─ org.eclipse.swt.cocoa.macosx.x86-4.4.2.jar
    │   ├─ ...more...optional...hidden...jars...here.jar
    │   └─ org.eclipse.swt.win32.win32.x86_64-4.4.2.jar
    └─ etc/
        └─ itis/
            ├─ application.properties
            ├─ application.yml
            └─ log4j.xml

已编辑

假设我们要运行chorke-itis-server-2.0.00-SNAPSHOT.jar by

java -jar ./bin/itis/chorke-itis-server-2.0.00-SNAPSHOT.jar

command 但不会执行,因为类路径中缺少它的依赖关系,例如:-

  1. 自己的jar库./bin/itis/lib/*.jar
  2. 常用jar库./lib/*.jar
  3. 可选的jar库./opt/*.jar
  4. 配置资源./etc/itis/*.*

这些依赖项不会像往常一样加载。我们应该做更多的事情来识别这些类路径。它可以通过提供类路径参数从命令行传递,也可以通过 java 程序动态传递。

您能否帮助我们通过核心 java 或任何类型的开源框架来构建动态类加载器?

【问题讨论】:

  • 如果这些是您创建的 JAR,那么您可以创建一个本地存储库并将 maven 指向它。如果它们在 maven-central 左右可用,您可以直接将依赖项放在 POM.xml 中,当您使用 maven install 编译项目时,它们已经被导入并在您的路径中。
  • 先生。 We are Borg 生产环境如何组装项目以通过java程序从不同位置动态加载类、资源、jar。
  • 你必须去OSGI 这样做。有一个 Maven 插件可以帮助创建和打包模块。
  • 先生。 Stefan你的权利,我们不感兴趣OSGI。我们想简单地使用 Java 默认的类加载器来处理它。 System.load(filename)System.loadLibrary(libname) 类似的东西。
  • 您始终可以在服务器端的开发机器上创建相同的本地存储库。很多公司都是这样做的!!!

标签: java spring maven ant classloader


【解决方案1】:

这是您需要的单个示例项目结构,而 BootstrapMainApplicationcom.chorke.boot 包内用于执行 java 应用程序的主类:-

/opt/java/chorke/itis/project/home/
    ├─ bin/
    │   └─ itis/
    │       ├─ lib/
    │       │   ├─ chorke-itis-utlity-2.0.00-SNAPSHOT.jar
    │       │   └─ chorke-itis-webapp-2.0.00-SNAPSHOT.jar
    │       ├─ chorke-itis-server-2.0.00-SNAPSHOT.jar         [executable jar]
    │       ├─ classes/
    │       ├─ README.md
    │       └─ LICENSE
    ├─ lib/
    │   ├─ usr/
    │   │   ├─ chorke-amqp-client-2.0.00-SNAPSHOT.jar
    │   │   └─ chorke-comn-spring-2.0.00-SNAPSHOT.jar
    │   └─ gpl/
    │       ├─ activemq-broker-5.10.2
    │       ├─ commons-lang3-3.3.2.jar
    │       ├─ ..more...and..more..jar
    │       └─ slf4j-log4j12-1.7.12.jar
    ├─ etc/
    │   └─ itis/
    │       ├─ application.properties
    │       ├─ application.yml
    │       └─ log4j.xml
    ├─ launch.bat
    └─ launch.sh

考虑到这个项目结构,您可以编写名为 launch.batlaunch.shbatshell 脚本适用于 Windows 和 Linux 平台。

launch.bat

goto launch

:launch
    SET CKI_HOME=.
    SET BIN_PATH=%CKI_HOME%\bin
    SET LIB_PATH=%CKI_HOME%\lib
    SET ETC_PATH=%CKI_HOME%\etc
    SET ITI_HOME=%BIN_PATH%\itis
    SET CLS_PATH=%ETC_PATH%\itis\;%ITI_HOME%\classes\
    SET CLS_PATH=%CLS_PATH%;%LIB_PATH%\gpl\*;%LIB_PATH%\usr\*;%ITI_HOME%\lib\*;%ITI_HOME%\*

    @REM SET CMD_EXCE=java -cp %CLS_PATH% com.chorke.boot.BootstrapMainApplication
    SET CMD_EXCE=java -classpath %CLS_PATH% com.chorke.boot.BootstrapMainApplication
    %CMD_EXCE%

对于 Linux 平台,使用此 shell 脚本可能工作正常

launch.sh

#!/bin/bash

function launch(){
    CKI_HOME='.';
    BIN_PATH="$CKI_HOME/bin";
    LIB_PATH="$CKI_HOME/lib";
    ETC_PATH="$CKI_HOME/etc";
    ITI_HOME="$BIN_PATH/itis";
    CLS_PATH="$ETC_PATH/itis/:$ITI_HOME/classes/";
    CLS_PATH="$CLS_PATH:$LIB_PATH/gpl/*:$LIB_PATH/usr/*:$ITI_HOME/lib/*:$ITI_HOME/*";

    #CMD_EXCE="java -cp $CLS_PATH com.chorke.boot.BootstrapMainApplication";
    CMD_EXCE="java -classpath $CLS_PATH com.chorke.boot.BootstrapMainApplication";
    $CMD_EXCE;
}

launch;

我认为这些脚本有助于构建您自己的应用程序生态系统/结构以及能够从不同位置加载类/配置/库。

【讨论】:

    猜你喜欢
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    相关资源
    最近更新 更多