如何在java中动态加载类,资源,jar?

时间:2015-10-05 09:51:44

标签: java spring maven ant classloader

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

  1. 第一个用于多个项目
  2. 和另一个单个项目结构。
  3. 我们想组装由多个项目组成的单个项目。我们的要求是通过java程序动态地从不同位置加载它的依赖,如资源 jars 。不添加类路径条目的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
    java -jar ./bin/itis/chorke-itis-server-2.0.00-SNAPSHOT.jar
    

    命令但它不会因为缺少类路径中的依赖性而执行,例如: -

    1. 自己的jar库./bin/itis/lib/*.jar
    2. 常见jar库./lib/*.jar
    3. 可选的jar库./opt/*.jar
    4. 配置资源./etc/itis/*.*
    5. 这些依赖项不会像通常的那样加载。我们应该做更多的事情来认识这些阶级路径。它将通过提供类路径参数从命令行传递或通过java程序动态传递。

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

1 个答案:

答案 0 :(得分:1)

以下是您需求的单个示例项目结构,而int main() { int ar[4] = {1,2,3,0}; double result; int gtr = 0; result = calculate(ar,4,&gtr); printf("%lf\n",result ); printf("gtr : %d\n",gtr); return 0; } double calculate(int ar[], int npts, int *gtr) { double total = 0 , average; int i = 0; for(i=0; i<npts; i++) { total = total + ar[i]; } average = total / npts; for( i = 0 ; i < npts ; i++ ) { if(average < ar[i]) { *gtr += 1; } } return average; } 是执行Java应用程序的BootstrapMainApplication包内的主要类: -

com.chorke.boot

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

launch.bat

/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

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

launch.sh

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%

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