Framwork增加资源后更新public.xml 和current.xml

本文详细介绍了在Android Framework层开发中如何有效地添加、管理资源。包括资源的分类、XML文件的作用、如何添加和修改ID等内容,以及解决资源冲突的方法。
http://www.linuxidc.com/Linux/2011-03/33356.htm
有时候我们想在标准的Framework中添加自己的新的资源怎么办呢?

办法就是我们来尝试下。

通过Eclipse的联系,我们可以联想到是否就是简单的把字符串放在res的各个文件夹里面。先来试试看,编译,系统立即报错。为什么呢?

它提示你利用make update-api这个命令来更新public.xml文件或者把这个声明称hide类型。这个肯定不是我们想要的。
所以方法有二:

方法1:正常添加完资源后,执行make update-api函数。系统更新res/values/public.xml文件。

方法2:正常添加完资源后,手动更改/res/values/public.xml文件。打开public.xml文件。

转自: http://hi.baidu.com/76591203/blog/item/1744fdce01210a1093457ecd.html
FRAMEWORK层开发(转)
2011-02-17 12:46
 framework的开发比应用层就要烦的多啦。做应用在eclipse中就足够了,用android系统中的控件等工具,或者是自己写个类来实现特定的功能。而framework层的开发,需要往源码中添加代码、xml、图片、id等等数据,这个id可是费了我好大的劲才搞定的。在项目开始的一个半月里,我探索、尝试了很多,现在把我的经验分享出来。网上关于framework层的开发信息很少,多是靠自己。

  最有效的方式就是分析android的源码,看google是怎样实现一个类的,以及类的层次。我现在看的主要是widget和app中的代码,其他的还没涉及。像View,ViewGroup,Activity,ActivityThread都是非常重要的类,也是代码量很大的类,我只是大概地过了下,还没有仔细分析过。

  我花大力气的地方是资源文件夹下values中几个文件的作用。

  attrs.xml中定义的是类的属性,属性是为了能在xml文件中被引用到,换句话说就是指定类中变量(也就是属性的实际作用者)的值。这些属性会在类的构造函数中用到。看过一两个源码就会明白,构造函数中的TypedArray其实就是属性的数组,数组的成员会被赋给类里的成员,完成从xml的初始化。类的构造函数一般有三个,一个是Class(context),这个用于在代码中创建一个类,所以只包含一个上下文;Class(context, attrs)和Class(context, attrs, defStyle)用于从xml创建类的情况。

  styles.xml中是各个控件的“样式”,样式由一个个属性所组成。我们在编辑xml文件的时候,不同的类所能设置的属性有共同的,也有不同的,都是由样式来控制的。具体可以去看styles.xml这个文件的内容。

  themes.xml其实也是样式,只是适用的范围大一点,这个我是参考网上别人的看法,自己还没研究过。

  ids.xml是公共的id,也就是对应用层可见的id,id是为了获得xml中的对象而需要的参数,也就是Object = findViewById(R.id.id_name)中的id_name。这些值可以在代码中用android.R.id引用到

  public.xml描述的是为attr、id、drawable所指定的一个32的id值,这个值在current.xml文件中会被用到。

  当我们对public.xml做了改动后,执行make update-api命令,相应的current.xml就会添加这些改动。因为这些值按类型被放在不同的段上,类型相同的必须连续存放,不指定id值的话系统会自动计算出下一个值。

  添加id的方法:1)在ids.xml中添加公共id项,在public.xml中也添加相应的id项。这种办法没有兼容性,会与后面的版本产生冲突。

         2)在ids.xml中添加公共id项,每一项前面加一行<!-- @hide -->的注释,这样就不用在public.xml中添加相应的项了。源码中是/** @hide  */的形式,这样current中就不会有相应的段了。

         3)在自己写的xml中,使用android:id = "@+id/id_name"的形式,就和在eclipse中一样,搜一下会发现android源码中也有这么用的,这样ids.xml和public.xml都不用改,兼容性我还不确定。
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [config/insure/webservicesClient.xml]; nested exception is java.io.FileNotFoundException: class path resource [config/insure/webservicesClient.xml] cannot be opened because it does not exist at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:344) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:224) at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.importBeanDefinitionResource(DefaultBeanDefinitionDocumentReader.java:234) ... 29 common frames omitted Caused by: java.io.FileNotFoundException: class path resource [config/insure/webservicesClient.xml] cannot be opened because it does not exist at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:180) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:330) ... 33 common frames omitted Disconnected from the target VM, address: '127.0.0.1:53422', transport: 'socket' Process finished with exit code 1
最新发布
11-08
<think>首先,用户的问题是关于解决Spring框架中的错误:`BeanDefinitionStoreException` `FileNotFoundException`,具体是资源文件 `class path resource [config/insure/webservicesClient.xml]` 不存在。用户提供了几个引用内容,我需要参考这些引用来解决这个问题。 回顾引用内容: - 引用[1]:提到异常是由于资源文件不存在导致的,类似用户的问题。 - 引用[2]:解释了Maven默认只扫描 `src/main/java` 中的文件,忽略了 `src/main/resources` 中的XML文件。解决方案是通过添加Maven的resources配置,确保资源文件被包含在构建中。 - 引用[3]:建议在Eclipse中使用Project > Clean,并勾选Build Automatically,以确保编译时包含资源文件。 - 引用[4]:提到清理Tomcat的webapps目录来解决问题。 用户的问题核心是 `config/insure/webservicesClient.xml` 文件在类路径中不存在。所以,我需要基于这些引用,提供解决方案。 关键步骤: 1. **检查文件位置**:确认 `webservicesClient.xml` 文件是否在项目中正确的位置。通常,应在 `src/main/resources/config/insure/` 目录下。 2. **Maven配置**:引用[2]中强调了Maven的资源扫描问题。需要修改 `pom.xml` 文件,添加resources配置,确保资源文件被复制到构建输出目录(如 `target/classes`)。 3. **IDE设置**:引用[3]提到在Eclipse中使用Project > Clean来强制重新编译复制文件。 4. **Tomcat清理**:引用[4]建议删除Tomcat的webapps目录下的项目文件,以避免旧缓存。 5. **文件路径验证**:确保在代码中引用的路径与实际文件路径匹配。用户指定了 `config/insure/webservicesClient.xml`,所以我需要建议检查路径是否正确。 结构化回答: - 逐步引导用户解决问题。 - 使用中文,因为系统指令要求使用中文回答。 - 引用的内容需要自然地添加引用标识,如[^1]。 - 最后,生成相关问题,作为指令要求的最后一部分。 回答结构: 1. **解释错误原因**:简要说明异常是由于类路径资源文件缺失导致的。 2. **解决方案步骤**: - 验证文件位置。 - 配置Maven或构建工具。 - 清理项目并重新构建。 - 检查Tomcat部署。 - 其他可能的原因。 3. **示例配置**:如果需要,提供代码块展示Maven配置。 4. **生成相关问题**:在末尾添加相关问题。 确保回答真实可靠: - 基于经验,常见原因包括: - 文件未正确放置在资源目录。 - Maven未包含配置文件。 - IDE缓存问题。 - 部署问题。 针对用户的具体文件(`config/insure/webservicesClient.xml`),我需要调整引用中的示例。 生成相关问题: - 指令要求生成相关问题,类似于示例。 - 例如: 1. 如何配置Maven来包含特定的资源文件? 2. Spring中如何处理资源加载问题? 3. 常见的Spring启动异常有哪些? 最终回答: </think>### 解决 Spring 框架中 BeanDefinitionStoreException FileNotFoundException 错误 遇到 `BeanDefinitionStoreException` `FileNotFoundException` 错误,提示 `class path resource [config/insure/webservicesClient.xml]` 不存在,通常是由于 Spring 在运行时无法在类路径中找到指定的配置文件。这可能是资源文件未被正确打包、路径错误或构建缓存问题导致的。以下是逐步的解决方案,基于您的引用内容[^1][^2][^3][^4]常见实践: --- ### 步骤 1: 验证文件位置路径 - **检查配置文件位置**: - 确认 `webservicesClient.xml` 文件是否放置在项目的正确目录中: - 对于 Maven 项目:文件应在 `src/main/resources/config/insure/webservicesClient.xml` 下(注意路径应与 `class path resource [config/insure/webservicesClient.xml]` 完全匹配)。 - 如果文件位于 `src/main/java/config/insure/` 下,也会导致加载失败[^2]。 - **为什么重要**:Spring 从类路径(如 `target/classes`)加载资源,文件必须存在于构建输出目录中[^1]。 - **验证路径引用**: - 在 Spring 配置中(如 `web.xml` 或 Java 配置类),检查路径是否拼写错误。例如: - 错误:`classpath:config/insure/webservicesClient.xml`(如果路径大小写或斜杠不匹配)。 - 正确:`classpath:config/insure/webservicesClient.xml`(确保与文件物理路径一致)。 --- ### 步骤 2: 配置构建工具(Maven/Gradle) - **Maven 资源包含设置**: - Maven 默认只编译 `src/main/java` 中的 `.java` 文件,忽略 `src/main/resources` 中的 XML 文件,导致打包后缺失[^2]。 - 修改 `pom.xml`,添加 `<resources>` 配置,确保资源文件被包含: ```xml <build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.xml</include> <!-- 包含所有 XML 文件 --> </includes> <filtering>false</filtering> </resource> <!-- 如果文件在 src/main/java 下,也添加此项 --> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build> ``` - **保存后执行**:运行 `mvm clean package` 或在 IDE 中重新构建项目。 - **Gradle 用户**: - 在 `build.gradle` 中添加: ```groovy sourceSets { main { resources { srcDirs = ['src/main/resources', 'src/main/java'] // 包含 Java 目录下的 XML include '**/*.xml' } } } ``` --- ### 步骤 3: 清理重新构建项目 - **清理 IDE 缓存**: - 在 Eclipse 或 IntelliJ IDEA 中: - Eclipse:点击 `Project > Clean...`,勾选 `Build Automatically` 后确认[^3]。 - IntelliJ:点击 `Build > Rebuild Project`。 - **为什么有效**:IDE 缓存可能导致资源文件未复制到 `target/classes`,清理强制刷新构建输出[^3]。 - **手动检查构建输出**: - 构建后,验证文件是否出现在 `target/classes/config/insure/webservicesClient.xml`(Maven)或 `build/resources/main/config/insure/webservicesClient.xml`(Gradle)。 - 如果文件缺失,确认步骤 2 的配置是否正确。 --- ### 步骤 4: 处理部署环境问题 - **清理 Tomcat 缓存**: - 停止 Tomcat 服务器。 - 删除 Tomcat 的 `webapps` 目录下与项目相关的文件夹(如 `your-project-name`) `work` 目录中的缓存文件[^4]。 - 重新启动 Tomcat。 - **示例命令**(Linux/macOS): ```bash rm -rf $TOMCAT_HOME/webapps/your-project-name rm -rf $TOMCAT_HOME/work/Catalina/localhost/your-project-name ``` - **验证类路径**: - 在运行时,添加日志检查类路径: ```java public class ResourceChecker { public static void main(String[] args) { String resourcePath = "config/insure/webservicesClient.xml"; URL url = Thread.currentThread().getContextClassLoader().getResource(resourcePath); if (url == null) { System.out.println("File not found at: " + resourcePath); } else { System.out.println("File found at: " + url.getPath()); } } } ``` - 运行此代码可快速定位资源是否在类路径中。 --- ### 其他可能原因 - **文件名或路径大小写敏感**:Linux 系统区分大小写,确保路径中的 `config/insure/` 与实际目录大小写一致。 - **Spring 配置错误**:如果使用 `@ImportResource` 或 XML 配置,检查路径前缀(如 `classpath:` vs. `file:`)。 - **依赖冲突**:如果有多个模块,确保资源文件在正确模块的 `src/main/resources` 下。 如果以上步骤无效,提供完整的项目结构错误日志可进一步诊断[^1][^2]。 --- ### 相关问题 1. 如何在 Spring Boot 中自定义资源文件加载路径? 2. Maven 构建时如何处理资源文件的过滤包含? 3. 常见的 Spring 启动异常有哪些,如何快速排查? 4. Tomcat 部署时如何避免缓存导致的配置问题?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值