Spring app 使用包的简化和注意的问题

      众所周知spring框架是一个非常优秀的轻量级框架工具,我们借助它可以简单的将软件各个部分割裂开以实现较低的耦合度。
那么我们在有些时候强外界发布这些软件时面临着一个选择--是否将spring的相关包一起发布,如果全部一齐发布则可能使原本非常小巧的程式变得非常庞大;
如果不发布则可能使客户端面临程式工作环境配置的复杂程度加大,在这里主要是spring框架的下载、配置和使用。
      基于以上情况我们选择一个折衷的办法:将spring工作必须的基本类文件和相关配置文件与我们的程式一起发布出去。在这里的问题就主要是包的选择(类相互的依赖关系)和框架类的一些配置文件的选择使用。
      由于我的经历有限,在此我就将我写的一个第三方eclipse插件管理器所面临的一些问题以及获得的经验和大家分享一下。在这里我将用一个简单的spring例子作为替代说明即可。
#System environment
Ubuntu 
7.10  Linux
Eclipse Platform Version:  3.3.0  + MyEclipse  6.0
      其中spring框架的加载和配置是通过MyEclipse的插件(MyEclipse-->Project Capabilities-->Add Spring ...-->Spring 2.0 Core ...)实现的。
      以下是一个简单的spring使用的程式代码:
<? xml version="1.0" encoding="UTF-8" ?>
< beans
    
xmlns ="http://www.springframework.org/schema/beans"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation
="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"
>
    
    
    
< bean  id ="HelloWorld"  class ="springapp.hello.HelloWorld" >
        
< property  name ="message" >
            
< value > world </ value >
        
</ property >
    
</ bean >


</ beans >

package  springapp.hello;

public   interface  Hello  {
    
public String sayHello();
}


package  springapp.hello;

public   class  HelloWorld  implements  Hello {
    
private String message;
    
    
public HelloWorld(){
        message
=null;
    }

    
    
public String sayHello(){
        
return "Hello "+message+"!";
    }


    
public String getMessage() {
        
return message;
    }


    
public void setMessage(String message) {
        
this.message = message;
    }


}


package  springapp.main;

import  org.springframework.context.ApplicationContext;
import  org.springframework.context.support.FileSystemXmlApplicationContext;

import  springapp.hello.Hello;

public   class  Main  {

    
/**
     * 
@param args
     
*/

    
public static void main(String[] args) {
        ApplicationContext ctx 
= new FileSystemXmlApplicationContext(
                
"/src/applicationContext.xml");
        Hello h 
= (Hello)ctx.getBean("HelloWorld");
        System.out.println(h.sayHello());
    }


}


最后运行Main类就会显示一些信息:
2008 - 02 - 14   14 : 50 : 55 , 954  INFO
 
[ org.springframework.context.support.FileSystemXmlApplicationContext ]
 - Refreshing org.springframework.context.support.FileSystemXmlApplicationContext
@f3d6a5: display name
 
[ org.springframework.context.support.FileSystemXmlApplicationContext@f3d6a5 ]
;  startup date [Thu Feb 14 14:50:55 CST 2008]; root of context hierarchy
2008 - 02 - 14   14 : 50 : 56 , 013  INFO
 
[ org.springframework.beans.factory.xml.XmlBeanDefinitionReader ]
- Loading XML bean definitions from file
 
[ /home/wpc/workspace/Java/MyStudy/SimplifySpringCoreJar/src/applicationContext.xml ]
2008 - 02 - 14   14 : 50 : 56 , 197  INFO
[ org.springframework.context.support.FileSystemXmlApplicationContext ]
- Bean factory for application context
[ org.springframework.context.support.FileSystemXmlApplicationContext@f3d6a5 ]
: org.springframework.beans.factory.support.DefaultListableBeanFactory@f7f540
2008 - 02 - 14   14 : 50 : 56 , 210  INFO
[ org.springframework.beans.factory.support.DefaultListableBeanFactory ]
 - Pre-instantiating singletons in
org.springframework.beans.factory.support.DefaultListableBeanFactory@f7f540
: defining beans 
[ HelloWorld ] ;  root of factory hierarchy
Hello world!
由于有个log配置文件的问题可能有些程式运行会有警告信息,这个不要紧,不再讨论范畴。
我的解决方案是:
#   For  JBoss: Avoid to setup Log4J outside  $ JBOSS_HOME / server / default / deploy / log4j . xml!
#   For  all other servers: Comment out the Log4J listener in web . xml to activate Log4J .
log4j
. rootLogger = INFO ,  stdout ,  logfile

log4j
. appender . stdout = org . apache . log4j . ConsoleAppender
log4j
. appender . stdout . layout = org . apache . log4j . PatternLayout
log4j
. appender . stdout . layout . ConversionPattern = %d %p [%c] - %m%n

log4j
. appender . logfile = org . apache . log4j . RollingFileAppender

#  The log file's location
log4j
. appender . logfile . File = springframe_log . log
log4j
. appender . logfile . MaxFileSize = 512KB

#  Keep three  backup   files .
log4j
. appender . logfile . MaxBackupIndex = 3

#  Pattern to output: data  priority  [category] -message
log4j
. appender . logfile . layout = org . apache . log4j . PatternLayout
log4j
. appender . logfile . layout . ConversionPattern = %d %p [%c] - %m%n

      文件命名为log4j.properties然后打包jar并且导入即可。
      但是如果将这个工程导出,一般是不携带spring框架类文件的,这时在外部运行Main类就可能出现问题,一般提示是spring相关的类文件无法找到。 我当时就是通过这样一些错误信息一步步补全我的spring基础类文件的,应该有相关的工具但是我没有找到。
      在这里我就将我的结果给大家:

 */可能可以再次简化,但是我没有继续进行,如果有兴趣可以继续,这样可以最大限度的简化类文件。
有500多个文件估计大家是不会自己组织的,我把他放在了csdn的资源里面:名字是《 spring core 运行时必要的基础包
在里面我们可以发现META-INF目录里面有一个spring.schemas文件,那么这个文件有什么作用呢?

XML Schema 简介

在这里体现的作用主要是:标记和识别。
那么他的影响是:就我的测试来看,如果系统是能够访问internet的那么运行这个程式时十分的慢(我估计是程式自动访问因特网去寻找相关的schema了),如果无法访问网络这导致了错误出现。这是相关的运行结果
wpc@wpc-laptop:~/Desktop/JavaTest/test$ java springapp.main.Main 
14 -Feb- 2008   15 : 28 : 19  org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO:
 Refreshing org.springframework.context.support.FileSystemXmlApplicationContext@
13f3789: display name 
[ org.springframework.context.support.FileSystemXmlApplicationContext@13f3789 ] ;
 startup date [Thu Feb 14 15:28:19 CST 2008]; root of context hierarchy

14 -Feb- 2008   15 : 28 : 19  org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from file
 
[ /home/wpc/Desktop/JavaTest/test/src/applicationContext.xml ]
14 -Feb- 2008   15 : 28 : 59  org.springframework.util.xml.SimpleSaxErrorHandler warning
WARNING: Ignored XML validation warning
org.xml.sax.SAXParseException: schema_reference
.4 :
 Failed to read schema document
 'http://www.springframework.org/schema/beans/spring-beans-
2.0 .xsd' ,  because  1 )
 could not find the document
;
 2) the document could not be read;
 3) the root element of the document is not <xsd:schema>.

        at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java: 195 )
        at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.warning(ErrorHandlerWrapper.java:
96 )
        at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:
380 )
        at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:
318 )
        at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.reportSchemaWarning(XSDHandler.java:
2540 )
        at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.getSchemaDocument(XSDHandler.java:
1836 )
        at com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDHandler.parseSchema(XSDHandler.java:
531 )
        at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaLoader.loadSchema(XMLSchemaLoader.java:
552 )
        at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.findSchemaGrammar(XMLSchemaValidator.java:
2408 )
        at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(XMLSchemaValidator.java:
1753 )
        at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(XMLSchemaValidator.java:
685 )
        at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:
400 )
        at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:
626 )
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:
3084 )
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:
912 )
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:
645 )
        at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:
140 )
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:
508 )
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:
807 )
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:
737 )
        at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:
107 )
        at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:
225 )
        at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:
283 )
        at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:
76 )
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:
361 )
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:
313 )
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:
290 )
        at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:
131 )
        at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:
147 )
        at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:
173 )
        at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:
112 )
        at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:
79 )
        at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:
101 )
        at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:
389 )
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:
324 )
        at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:
124 )
        at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:
68 )
        at springapp.main.Main.main(Main.java:
24 )
Exception in thread 
" main "  org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException:
 Line 
5  in XML document from file
 
[ /home/wpc/Desktop/JavaTest/test/src/applicationContext.xml ]  is invalid ;
 nested exception is org.xml.sax.SAXParseException: cvc-elt.1:
 Cannot find the declaration of element 'beans'.

Caused by: org.xml.sax.SAXParseException: cvc-elt .1 : Cannot find the declaration of element 'beans'.
        at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:
195 )
        at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:
131 )
        at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:
384 )
        at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:
318 )
        at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleStartElement(XMLSchemaValidator.java:
1887 )
        at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.startElement(XMLSchemaValidator.java:
685 )
        at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:
400 )
        at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:
626 )
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:
3084 )
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:
912 )
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:
645 )
        at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:
140 )
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:
508 )
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:
807 )
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:
737 )
        at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:
107 )
        at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:
225 )
        at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:
283 )
        at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:
76 )
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:
361 )
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:
313 )
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:
290 )
        at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:
131 )
        at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:
147 )
        at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:
173 )
        at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:
112 )
        at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:
79 )
        at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:
101 )
        at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:
389 )
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:
324 )
        at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:
124 )
        at org.springframework.context.support.FileSystemXmlApplicationContext.<init>(FileSystemXmlApplicationContext.java:
68 )
        at springapp.main.Main.main(Main.java:
24 )
无法解析xml文件而导致程式无法运行。如果将那个spring.schemas文件放入其中则一上两种情况都没有发生。
目录结构:
/**********************************************
.:
META-INF
org
springapp
src

./META-INF:
spring.schemas

./org:
apache
springframework

./springapp:
hello
main

./springapp/hello:
Hello.class
HelloWorld.class

./springapp/main:
Main.class

./src:
applicationContext.xml
**********************************************/
      按照以上配置,程式便可以运行了。
      最后我要强调的是那个 spring.schemas文件以及整个目录结构。当然你也可以对那些类和 META-INF打包成jar文件以方便使用,不过那个src(即那个xml文件夹)要单独存在。
      希望通过大家的共同努力我们能进一步简化整个框架结构,为我们的程式打造更加小巧的世界。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值