75前面提到的nameNotFoundException的解决

本文介绍了如何在手机应用中获取并处理进程信息,特别关注了对于非APK进程(如C语言实现的内核进程)的异常捕获与处理策略。

在前面的代码中(72篇),运行的时候,会打印system.err(catch语句捕获的异常),是因为有的进程,他压根没有对应的apk文件,它是c语言或者其他语言实现(比如内核进程)我们只需要在catch语句处理这些即可:

package com.ustc.mobilemanager.engine;

import java.util.ArrayList;
import java.util.List;

import com.ustc.mobilemanager.R;
import com.ustc.mobilemanager.domain.TaskInfo;

import android.app.ActivityManager;
import android.app.ActivityManager.RunningAppProcessInfo;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.os.Debug.MemoryInfo;

/**
 * 
 * 提供手机里面的进程信息
 * 
 * @author
 * 
 */
public class TaskInfoProvider {

	/**
	 * 获取所有的进程信息
	 * 
	 * @param context
	 * @return
	 */
	public static List<TaskInfo> getTaskInfo(Context context) {

		ActivityManager am = (ActivityManager) context
				.getSystemService(Context.ACTIVITY_SERVICE);
		PackageManager pm = context.getPackageManager();
		List<RunningAppProcessInfo> processInfos = am.getRunningAppProcesses();

		List<TaskInfo> taskInfos = new ArrayList<TaskInfo>();
		for (RunningAppProcessInfo processInfo : processInfos) {

			TaskInfo taskInfo = new TaskInfo();

			// 进程名就是包名
			String packname = processInfo.processName;

			taskInfo.setPackname(packname);

			// import android.os.Debug.MemoryInfo导包不能导错了
			MemoryInfo[] memoryInfos = am
					.getProcessMemoryInfo(new int[] { processInfo.pid });
			// 转成byte,方便转化
			long memsize = memoryInfos[0].getTotalPrivateDirty() * 1024l;
			taskInfo.setMemSize(memsize);

			try {
				// PackageInfo packageInfo = pm.getPackageInfo(packname, 0);
				// packageInfo.applicationInfo

				ApplicationInfo applicationInfo = pm.getApplicationInfo(
						packname, 0);
				Drawable icon = applicationInfo.loadIcon(pm);
				taskInfo.setIcon(icon);

				String name = applicationInfo.loadLabel(pm).toString();

				taskInfo.setName(name);

				if ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
					// 用户进程
					taskInfo.setUserTask(true);

				} else {
					// 系统进程

					taskInfo.setUserTask(false);
				}

			} catch (Exception e) {
				e.printStackTrace();
				//系统内核进程   没有名称
				taskInfo.setName(packname);
				taskInfo.setIcon(context.getResources().getDrawable(R.drawable.icon));
			}
			taskInfos.add(taskInfo);
		}
		return taskInfos;
	}

}


<think>好的,我现在需要解决用户提出的关于javax.naming.NameNotFoundException异常的原因及解决方法的问题。首先,我得回顾用户提供的引用内容,看看有没有相关的线索。用户提供的引用中,有几个关键点需要注意。引用[1]提到在导入Eclipse项目时出现这个异常,可能是因为JNDI数据源配置的问题,但用户的项目中并没有显式配置JNDI。引用[2]指出用户使用的是Spring3.2、Spring MVC、Druid和MyBatis,可能涉及配置问题或依赖冲突。引用[3]提到了JBoss的端口配置,可能与应用服务器配置有关。引用[4]建议在web.xml中添加一些上下文参数,可能与环境配置有关。接下来,我需要分析这个异常的一般原因。JNDI查找失败通常有几个常见原因:资源未正确绑定、名称拼写错误、应用服务器配置问题、依赖缺失或版本冲突,以及环境配置错误。结合用户的情况,他们的项目没有显式使用JNDI,但可能某些库或框架隐式依赖了JNDI,比如数据源配置可能错误地指向了JNDI而不是其他连接池方式。 然后,我需要考虑解决方案。首先检查配置文件,比如spring的XML或Java配置,确保数据源没有使用JNDI查找。例如,Druid通常是通过Bean直接配置,而不是JNDI。然后检查依赖,特别是与数据源和JNDI相关的库,比如是否有旧版本的Spring或MyBatis引入了不必要的JNDI依赖。另外,应用服务器(如Tomcat或JBoss)的配置是否正确,可能需要在服务器中绑定相应的资源,或者调整端口设置,如引用[3]中的JBoss端口配置。环境配置方面,如引用[4]提到的设置activeprofile,可能需要确认是否启用了正确的环境配置,避免配置被覆盖或缺失。 此外,用户提到可能的问题包括jar冲突、Spring配置问题,甚至Spring内部的问题。需要建议用户检查依赖树,排除冲突的jar,比如使用Maven的依赖分析工具。同时,查看Spring的配置文件,确保数据源正确注入,没有残留的JNDI配置。如果问题依然存在,可能需要尝试升级Spring版本,因为旧版本可能存在已知的问题。 最后,生成相关问题,帮助用户深入排查,比如检查数据源配置方式、依赖冲突、应用服务器设置等。</think>### javax.naming.NameNotFoundException 原因及解决方法 #### 异常原因分析 1. **未正确配置JNDI资源** 当应用尝试通过JNDI名称(如$jdbc/myDataSource$)查找数据源或其他资源时,若服务器未绑定该名称,会抛出此异常。常见于以下场景: - 未在应用服务器(如Tomcat、JBoss)中定义资源[^3] - Spring配置中误启用JNDI查找,但实际未配置对应资源[^2] 2. **依赖或版本冲突** 某些框架(如Spring)可能隐式依赖JNDI,若项目中存在旧版本库或冲突的JAR包(如$spring-jdbc$与$mybatis$版本不兼容),会导致自动触发JNDI查找逻辑[^2]。 3. **环境配置缺失** 未在$web.xml$中指定激活的Spring Profile(如$dev$),导致数据源配置未被加载[^4]。 --- #### 解决步骤 **1. 检查数据源配置方式** - 若使用Druid+MyBatis,应通过Spring Bean直接配置数据源,而非JNDI。示例配置: ```xml <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="url" value="jdbc:mysql://localhost:3306/db"/> <property name="username" value="root"/> </bean> ``` - 移除所有类似$<jee:jndi-lookup>$的JNDI相关配置[^2] **2. 排除依赖冲突** - 检查是否包含不必要的JNDI库(如$tomcat-jdbc$或$jboss-naming$) - 使用Maven依赖树分析工具: ```shell mvn dependency:tree -Dincludes=org.springframework ``` **3. 验证应用服务器配置** - 对于JBoss/Tomcat,需在$context.xml$或$standalone.xml$中明确绑定资源。例如JBoss端口配置: ```xml <socket-binding name="jndi-port" port="1099"/> ``` [^3] **4. 添加环境参数** 在$web.xml$中强制激活Profile,确保数据源配置生效: ```xml <context-param> <param-name>spring.profiles.active</param-name> <param-value>dev</param-value> </context-param> ``` [^4] --- #### 验证方案 1. 在代码中打印当前激活的Profile: ```java Environment env = ctx.getEnvironment(); System.out.println("Active profiles: " + Arrays.toString(env.getActiveProfiles())); ``` 2. 使用调试工具检查数据源Bean是否成功注入 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值