众所周知spring框架是一个非常优秀的轻量级框架工具,我们借助它可以简单的将软件各个部分割裂开以实现较低的耦合度。
那么我们在有些时候强外界发布这些软件时面临着一个选择--是否将spring的相关包一起发布,如果全部一齐发布则可能使原本非常小巧的程式变得非常庞大;
如果不发布则可能使客户端面临程式工作环境配置的复杂程度加大,在这里主要是spring框架的下载、配置和使用。
基于以上情况我们选择一个折衷的办法:将spring工作必须的基本类文件和相关配置文件与我们的程式一起发布出去。在这里的问题就主要是包的选择(类相互的依赖关系)和框架类的一些配置文件的选择使用。
由于我的经历有限,在此我就将我写的一个第三方eclipse插件管理器所面临的一些问题以及获得的经验和大家分享一下。在这里我将用一个简单的spring例子作为替代说明即可。
其中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文件,那么这个文件有什么作用呢?
在这里体现的作用主要是:标记和识别。
那么他的影响是:就我的测试来看,如果系统是能够访问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文件夹)要单独存在。
希望通过大家的共同努力我们能进一步简化整个框架结构,为我们的程式打造更加小巧的世界。
那么我们在有些时候强外界发布这些软件时面临着一个选择--是否将spring的相关包一起发布,如果全部一齐发布则可能使原本非常小巧的程式变得非常庞大;
如果不发布则可能使客户端面临程式工作环境配置的复杂程度加大,在这里主要是spring框架的下载、配置和使用。
基于以上情况我们选择一个折衷的办法:将spring工作必须的基本类文件和相关配置文件与我们的程式一起发布出去。在这里的问题就主要是包的选择(类相互的依赖关系)和框架类的一些配置文件的选择使用。
由于我的经历有限,在此我就将我写的一个第三方eclipse插件管理器所面临的一些问题以及获得的经验和大家分享一下。在这里我将用一个简单的spring例子作为替代说明即可。
#System environment
Ubuntu
7.10
Linux
Eclipse Platform Version:
3.3.0
+ MyEclipse
6.0



以下是一个简单的spring使用的程式代码:





http://www.springframework.org/schema/beans/spring-beans-2.0.xsd" >




























































最后运行Main类就会显示一些信息:

[ 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


我的解决方案是:






















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

*/可能可以再次简化,但是我没有继续进行,如果有兴趣可以继续,这样可以最大限度的简化类文件。
有500多个文件估计大家是不会自己组织的,我把他放在了csdn的资源里面:名字是《 spring core 运行时必要的基础包》
在里面我们可以发现META-INF目录里面有一个spring.schemas文件,那么这个文件有什么作用呢?
在这里体现的作用主要是:标记和识别。
那么他的影响是:就我的测试来看,如果系统是能够访问internet的那么运行这个程式时十分的慢(我估计是程式自动访问因特网去寻找相关的schema了),如果无法访问网络这导致了错误出现。这是相关的运行结果



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


[ /home/wpc/Desktop/JavaTest/test/src/applicationContext.xml ]



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>.







































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'.



































目录结构:
/**********************************************
.:
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文件夹)要单独存在。
希望通过大家的共同努力我们能进一步简化整个框架结构,为我们的程式打造更加小巧的世界。