glassfish创建连接池失败(Class name is wrong or classpath is not set for : com.mysql.jdbc.jdbc2.optional.My)

本文详细介绍了在部署使用数据库的应用于玻璃鱼v3环境中时,确保数据库驱动包已正确放置的重要性。忽视此步骤可能导致部署失败或运行时错误。文章提供了操作指南和注意事项,确保应用顺利部署。

1.向服务器已有实例glassfishv3\glassfish\domains\domain1\lib\ext目录下添加数据库驱动包

2.创建数据库连接池

3.创建数据为连接资源

4.发布应用

备注:glassfish V3 旧版当部署EJB应用时,如果没有事前添加数据库驱动包到glassfishv3\glassfish\domains\domain1\lib\ext下,部署也可以通过,但在客户连接时报错(报出来的错也看不明白是哪里的错,会让人莫明其妙),高一点的版本会在部署时就提示这个校验错误然后部署不通过,所以部署引用了数据库驱动包的一定记得先部署数据库驱动包哦。


注意如果忘了将数据驱动包放进glassfish目录下,之后放进去后,记得重新启动glassfish(可以在netbeans中启动),

<think> 我们正在解决一个编译错误:`com.android.tools.r8.internal.If: Absent Code attribute in method that is not native or abstract`。这个错误通常与依赖库中的字节码问题有关,特别是当依赖库中的某些方法缺少实现(即缺少Code属性)时,而它们既不是原生方法(native)也不是抽象方法(abstract)。根据引用[4]和引用[5],这个问题常见于引入的依赖库(如`javaee-api`)只包含API而不包含实现(即只有方法签名,没有方法体)。 ### 错误原因分析 1. **依赖库问题**:项目中可能引入了仅包含接口定义(没有方法实现)的库,例如`javax:javaee-api`(引用[5])。这种库通常用于编译阶段,但在运行时需要具体的实现库。 2. **R8/ProGuard混淆**:在编译优化(如R8或ProGuard)过程中,这些没有实现的方法会被标记为错误,因为它们不符合字节码规范(非抽象方法必须有实现)。 ### 解决方案 #### 步骤1:识别问题依赖 检查项目的依赖树,找出可能引起问题的依赖项(通常是`javaee-api`、`javax.servlet:servlet-api`等)。可以通过以下命令查看依赖树: ```bash ./gradlew app:dependencies ``` 或者在Android Studio中打开`build.gradle`文件,查看依赖项。 #### 步骤2:替换依赖 将问题依赖从仅包含API的库替换为包含实现的库。例如: - **错误配置**(引用[5]): ```groovy implementation 'javax:javaee-api:6.0' ``` - **正确配置**(使用GlassFish实现): ```groovy implementation 'org.glassfish.main:javaee-api:6.0' ``` 或者使用其他包含实现的库,如: ```groovy implementation 'javax:javaee-web-api:6.0' // 注意: 这个可能仍然只有API,需要确认 ``` #### 步骤3:排除传递依赖(可选) 如果问题依赖是通过其他库传递引入的,可以使用`exclude`排除: ```groovy implementation('some.library') { exclude group: 'javax', module: 'javaee-api' } ``` #### 步骤4:使用运行时依赖(`runtimeOnly`) 如果问题依赖是编译时必须但运行时由其他库提供实现的,可以改为: ```groovy compileOnly 'javax:javaee-api:6.0' // 编译时使用 runtimeOnly 'org.glassfish.main:javaee-api:6.0' // 运行时提供实现 ``` #### 步骤5:检查其他依赖 类似问题可能出现在其他依赖上,如: - `javax.servlet:servlet-api` → 替换为 `org.apache.tomcat:tomcat-servlet-api` - `org.apache.geronimo.specs:geronimo-servlet_3.0_spec` → 替换为包含实现的库 ### 示例:修复后的`build.gradle` ```groovy dependencies { // 替换问题依赖 implementation 'org.glassfish.main:javaee-api:6.0' // 或者使用其他实现,如: // implementation 'org.apache.geronimo.specs:geronimo-ejb_3.1_spec:1.0.2' // 排除传递依赖示例 implementation('com.example:library-with-bad-dependency:1.0') { exclude group: 'javax', module: 'javaee-api' } } ``` ### 验证解决 1. 清理项目: ```bash ./gradlew clean ``` 2. 重新构建: ```bash ./gradlew assembleDebug ``` ### 根本原因 根据引用[4],该错误的本质是: > 类文件中非原生或抽象的方法缺少Code属性。 因此,**确保所有非抽象方法都有具体的字节码实现**是解决此问题的核心。 ### 相关问题 §§相关问题§§ 1. 如何查看Android项目的完整依赖树? 2. 除了GlassFish,还有哪些库可以提供Java EE API的实现? 3. 在Gradle中如何配置编译时依赖和运行时依赖? </think> ### 解决 `Absent Code attribute in method that is not native or abstract` 错误 该错误通常发生在编译优化阶段(如 R8 或 ProGuard),表明某个类的方法**缺少字节码实现**,但根据签名它既不是 `native` 方法也不是 `abstract` 方法。根据引用[4][^4]和引用[5][^5],主要原因和解决方案如下: #### 🔍 核心原因分析 1. **依赖库问题**(最常见) 使用了仅含接口定义(无实现)的依赖库(如 `javaee-api`),其方法签名存在但无字节码实现[^5]。 ```groovy // 错误示例:仅有API定义无实现的依赖 implementation 'javax:javaee-api:6.0' ``` 2. **字节码生成异常** 插桩工具(如 ASM)生成错误字节码,导致方法实现缺失[^3]。 3. **SDK/JAR 文件损坏** 本地 SDK 或依赖的 JAR 文件不完整或版本冲突[^4]。 #### ✅ 解决方案 ##### 1️⃣ 修复依赖配置(首要步骤) **替换纯接口库为包含实现的库**: ```groovy // build.gradle (app) dependencies { // ❌ 移除问题依赖 // implementation 'javax:javaee-api:6.0' // ✅ 替换为包含实现的依赖 implementation 'org.glassfish.main:javaee-api:6.0' // 或使用具体实现库 implementation 'org.eclipse.persistence:javax.persistence:2.2.1' } ``` ##### 2️⃣ 检查字节码插桩工具 若使用 ASM 等插桩工具(引用[3][^3]),需验证: 1. 在 `visitCode()` 方法中确保生成有效字节码 ```java public void visitCode() { super.visitCode(); // 确保此处生成有效字节码指令 mv.visitLdcInsn("Method entered"); mv.visitMethodInsn(INVOKESTATIC, "android/util/Log", "d", ...); } ``` 2. 在 `visitInsn()` 中处理 `RETURN` 指令时补充完整逻辑 ##### 3️⃣ 清理和验证依赖 ```bash # 清理构建缓存 ./gradlew cleanBuildCache # 重新下载依赖 rm -rf ~/.gradle/caches/ ./gradlew --refresh-dependencies ``` ##### 4️⃣ 检查 SDK 完整性 1. 打开 **SDK Manager** → **SDK Tools** 2. 勾选 **Show Package Details** → 确保以下组件完整: - Android SDK Build-Tools - Android SDK Platform-Tools - Android Emulator #### ⚠️ 特殊情况处理 若依赖无法替换,添加规则忽略特定类: ```proguard # proguard-rules.pro -dontwarn com.example.problematic.** -keep class com.example.problematic.** { *; } ``` #### 📊 验证流程 1. 运行依赖分析: ```bash ./gradlew app:dependencies > deps.txt ``` 2. 搜索 `javaee-api` 或 `javax.persistence` 确认替换成功 > **关键提示**:根据引用[4][^4],始终从[官方源](https://www.oracle.com/java/technologies/javaee-glance.html)获取 Java EE 依赖,避免不完整 JAR。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值