这里我们展示了两个项目结构。
- 第一个多个项目
- 和另一个用于单个项目结构。
我们想要组装由多个项目组成的单个项目。我们的要求是通过java程序动态地从不同位置加载它的依赖项,如类, 资源, jar 。没有在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
命令,但它不会执行,因为它在类路径中缺乏依赖,例如:-
- 自己的jar库
- 可选jar库
./opt/*.jar
- 配置资源
./etc/itis/*.*
./bin/itis/lib/*.jar
通用jar库./lib/*.jar
这些依赖项将不会像通常的进程那样加载。我们应该做更多的工作来认识这些阶级道路。它可以通过提供类路径参数从命令行传递,也可以由java程序动态传递。
你能帮助我们建立动态类加载器的帮助核心java或任何一种开源框架?
标题>这是您需要的单个示例项目结构,而BootstrapMainApplication
是com.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
考虑到这个项目结构,您可以编写bat或shell脚本,命名为launch.bat和launch.sh,适用于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;
我认为这些脚本将有助于构建自己的应用程序生态系统/结构,以及能够从不同的位置加载类/配置/库。