我正在开发一个由 Android 应用程序使用的嵌入式 Java 应用程序 (jar)。(Android 设备(API19)只是视图,我将带有 Gradle 的 JAR 导入到我的 Android Studio 项目中)。
我正在使用H2
数据库(在 Android 上测试),我正在尝试将它与连接池一起使用(尝试C3P0
和HakiriCP
)。
这是 jar pom 文件内容(使用 HakiriCP):
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.app</groupId>
<artifactId>reactor</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<log4j.version>1.2.15</log4j.version>
<rx.version>1.3.8</rx.version>
<dbh2.version>1.4.196</dbh2.version>
<junit.version>4.7</junit.version>
<json.version>20180813</json.version>
<slf4j-log4j12.version>1.7.21</slf4j-log4j12.version>
<log4j.version>1.2.17</log4j.version>
</properties>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/alternateLocation</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
<includeScope>provided</includeScope>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<finalName>uber-${artifactId}-${version}</finalName>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<!-- https://mvnrepository.com/artifact/io.reactivex/rxjava -->
<dependency>
<groupId>io.reactivex</groupId>
<artifactId>rxjava</artifactId>
<version>${rx.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>${dbh2.version}</version>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP-java7</artifactId>
<version>2.4.13</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.json/json -->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>${json.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j-log4j12.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j-log4j12.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/apache-log4j-extras -->
<dependency>
<groupId>log4j</groupId>
<artifactId>apache-log4j-extras</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.ghgande</groupId>
<artifactId>j2mod</artifactId>
<version>2.5.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/j2mod.jar</systemPath>
</dependency>
</dependencies>
</project>
为了构建 jar,我使用了 maven 插件(程序集、one-jar...)来确保所有依赖项都在类路径中。
当我运行 JAR 时,一切都运行良好,但是当我尝试运行 Android 应用程序(使用该 jar)时,我遇到了一些错误。这是我的Android项目gradle文件内容:
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
buildToolsVersion '27.0.3'
defaultConfig {
applicationId 'com.app.android'
minSdkVersion 19
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
dataBinding {
enabled = true
}
productFlavors {
}
}
dependencies {
def lifecycle_version = "1.1.1"
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
implementation 'com.android.support:recyclerview-v7:26.1.0'
implementation 'com.android.support:design:26.1.0'
implementation "android.arch.lifecycle:extensions:$lifecycle_version"
implementation (group: 'com.zaxxer', name: 'HikariCP-java7', version: '2.4.13')
implementation files('libs/reactor.jar')
}
我得到的错误主要是Class-not-found Exception
:
Caused by: java.lang.ClassNotFoundException: Class io.prometheus.client.Collector not found
在范围内HakiriCP
有一些依赖项,provided
所以我尝试在我的 Android gradle 文件中导入这些依赖项,但我仍然遇到错误,例如:
10-03 10:55:17.960 18268-18281/com.atlantium.aio.android E/dalvikvm: Could not find class 'javax.naming.InitialContext', referenced from method com.zaxxer.hikari.HikariConfig.getObjectOrPerformJndiLookup
10-03 10:55:17.960 18268-18281/com.atlantium.aio.android W/dalvikvm: VFY: unable to resolve new-instance 4434 (Ljavax/naming/InitialContext;) in Lcom/zaxxer/hikari/HikariConfig;
10-03 10:55:17.960 18268-18281/com.atlantium.aio.android D/dalvikvm: VFY: replacing opcode 0x22 at 0x0004
10-03 10:55:17.960 18268-18281/com.atlantium.aio.android W/dalvikvm: VFY: unable to resolve exception class 4437 (Ljavax/naming/NamingException;)
VFY: unable to find exception handler at addr 0x11
VFY: rejected Lcom/zaxxer/hikari/HikariConfig;.getObjectOrPerformJndiLookup (Ljava/lang/Object;)Ljava/lang/Object;
VFY: rejecting opcode 0x0d at 0x0011
VFY: rejected Lcom/zaxxer/hikari/HikariConfig;.getObjectOrPerformJndiLookup (Ljava/lang/Object;)Ljava/lang/Object;
Verifier rejected class Lcom/zaxxer/hikari/HikariConfig;
有什么我想念的吗?
是否可以在 android 上使用 JDBC 连接池?(根据在 android 中建立与 MySQL 的池连接是可能的,但我仍然无法让它工作)。
也许有人可以推荐另一个在android上测试的连接池?
谢谢
更新
根据 H2 文档:
目前只支持JDBC API(计划在以后的版本中支持Android数据库API)......
限制:目前不支持使用连接池,因为需要 javax.sql。类在 Android 上不可用。