---
navTitle: 扩展自带java类或jar包
---
# 扩展自带java类或jar包

扩展可以自带java类或jar包，并支持脚本调用自带的java类，也支持同时安装多个扩展，每个扩展自带各自的java库，如多个数据库连接器扩展各自携带同一个数据库的不同版本的驱动程序，如SQL Server2000的和SQL Server最新驱动。

## 如何自带java类或jar包{#include-lava-lib}

扩展如需自带java类，只需要按约定的目录结构将class文件或者jar文件放入扩展目录即可，所有[扩展点](../extension-points/README.md)都支持，目录结构如下：

```js
扩展根目录
└── java                           --> 约定的存放java类库的目录
    ├── classes                    --> 按需存放class 
    │   └── com
    │       └── succez
    │           └── Class.class
    └── lib                        --> 按需存放jar包
        └── a.jar
```

## 如何使用自带的java类{#get-javatype}

在扩展内部的后端脚本文件（`.cation`）中可以通过`Java.type()`函数获取，如：

```js
var Class1 = Java.type("com.xxx.Class1");
var obj1 = new Class1();
// WARNING 不支持下面这个方式：
// var Class2 = com.xxx.Class1;
```

在扩展外部的后端脚本文件（`.cation`）中也可以获取，如：

```js
var sys = require("svr-api/sys");

var ext = sys.getExtension("扩展名");
var Class1 = ext.getJavaType("com.xxx.Class1");
var obj1 = new Class1();
```

## 类加载机制{#classloader-hierarchy}

假设当前应用运行在Tomcat内，那么类的加载层次如下：

```md
Tomcat-Bootstrap
        |
Tomcat-System
        |
Tomcat-Common
    /      \
SuccApp1     SuccApp2 ...
            /      \            
    Extension1     Extension2 ...
```

1. 扩展自带的java类会在扩展初始化的时候被加载到jvm内，如果当前部署的是集群，那么也会自动在集群的每个节点上加载。
2. 每个扩展的类都只在自己的ClassLoader中加载，不会影响到系统自带的类，也不会影响到其它扩展。
3. 当扩展自带的类和应用或者Tomcat中的类冲突时，会优先使用扩展自带的类。 SuccApp 自带了很多第三方常用的工具包，如果扩展能用，建议直接使用。
