配置默认Action
<package>
<default-action-ref name="index"/>
<action name="index"></action>
</package>
配置Action的默认处理类
原本的默认处理器是struts-default中的ActionSupport
如需改变
<package>
<default-class-ref class="com.controller.Index"/>
</package>
我有一个Spring Boot项目,我可以在IntelliJ中成功运行,但是当我打包一个可执行jar时,我再也无法运行它了.这是异常的堆栈跟踪:
18:13:55.254 [main] INFO o.s.c.a.AnnotationConfigApplicationContext - Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@b3d7190: startup date [Wed Sep 07 18:13:55 CEST 2016]; root of context hierarchy
18:13:55.403 [main] WARN o.s.c.a.AnnotationConfigApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to process import candidates for configuration class [el.dorado.App]; nested exception is java.lang.IllegalArgumentException: No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.
18:13:55.414 [main] ERROR o.s.boot.SpringApplication - Application startup failed
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to process import candidates for configuration class [el.dorado.App]; nested exception is java.lang.IllegalArgumentException: No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.
at org.springframework.context.annotation.ConfigurationClassParser.processDeferredImportSelectors(ConfigurationClassParser.java:489)
at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:191)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:321)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:243)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:273)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:98)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:681)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:523)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:369)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:313)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1185)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1174)
at dz.lab.jpmtask.App.main(App.java:33)
Caused by: java.lang.IllegalArgumentException: No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.
at org.springframework.util.Assert.notEmpty(Assert.java:276)
at org.springframework.boot.autoconfigure.EnableAutoConfigurationImportSelector.getCandidateConfigurations(EnableAutoConfigurationImportSelector.java:145)
at org.springframework.boot.autoconfigure.EnableAutoConfigurationImportSelector.selectImports(EnableAutoConfigurationImportSelector.java:84)
at org.springframework.context.annotation.ConfigurationClassParser.processDeferredImportSelectors(ConfigurationClassParser.java:481)
... 13 common frames omitted
我的配置是这样的:
@Configuration
@EnableAutoConfiguration
public class AppConfig {
... some beans
}
我在项目资源文件夹下添加了META-INF / spring.factories,如下面的43.2 Locating auto-configuration candidates所述,但这并没有解决问题:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
el.dorado.AppConfig
这是项目pom.xml:
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
el.dorado
ElDorado
jar
1.0-SNAPSHOT
ElDorado
http://maven.apache.org
4.12
org.springframework.boot
spring-boot-starter-parent
1.4.0.RELEASE
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-data-jpa
com.h2database
h2
junit
junit
${junit.version}
test
maven-assembly-plugin
el.dorado.App
true
jar-with-dependencies
make-assembly
package
single
org.jacoco
jacoco-maven-plugin
jacoco-initialize
prepare-agent
jacoco-site
verify
report
解决方法:
我只想弄清楚,我应该一直使用Spring Boot maven plugin.现在我的pom.xml的构建部分如下所示:
org.springframework.boot
spring-boot-maven-plugin
true
dz.lab.jpmtask.App
repackage
org.jacoco
jacoco-maven-plugin
jacoco-initialize
prepare-agent
jacoco-site
verify
report
我使用mvn clean包和java -jar target / myproject.jar构建项目,它就像一个魅力.
标签:java,spring,spring-boot,maven,spring-data-jpa
来源: https://codeday.me/bug/20190926/1817967.html
配置默认Action
<package>
<default-action-ref name="index"/>
<action name="index"></action>
</package>
配置Action的默认处理类
原本的默认处理器是struts-default中的ActionSupport
如需改变
<package>
<default-class-ref class="com.controller.Index"/>
</package>
转载于:https://www.cnblogs.com/to-red/p/11188771.html
任何编程语言都有自己的读写配置文件的方法和格式,Java也不例外。
在Java编程语言中读写资源文件最重要的类是Properties,功能大致如下:
1. 读写Properties文件
2. 读写XML文件
3. 不仅可以读写上述两类文件,还可以读写其它格式文件如txt等,只要符合key=value格式即可.
注意:资源文件中含有中文时的处理方法
1. 将中文字符通过工作转成utf8编码,可以通过Java自带的nativetoascii或Eclipse中的属性编辑器。
2. 直接调用 new String(youChineseString.getBytes("ISO-8859-1"), "GBK");
附:WEB程序中加载资源文件的方法
Properties prop = null;
1. prop = Thread.currentThread().getContextClassLoader().getResourceAsStream("filename");
2. prop = this.getClass().getClassLoader().getResourceAsStream("filename");
Properties类继承自Hashtable,大致API如下:
好了,直接用代码说话吧,这个类很容易使用
看下Demo目录结构:
先来个读取配置文件类:PropertiesReader.java
关于Properties读取文件这里提供六种方法:《JAVA读取Properties的六种方法》,下面取最常用的一种
关于路径的写法:(可以相对路径也可以是绝对路径)
Class.getResourceAsStream(String path)
path 不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从ClassPath(src文件)根下获取。
1 packagecom.lcw.properties.test;2
3 importjava.io.IOException;4 importjava.io.InputStream;5 importjava.util.Enumeration;6 importjava.util.Properties;7
8 /**
9 * properties文件读取类10 *11 */
12 public classPropertiesReader {13
14 public voidgetPropertiesReader(){15 Properties properties=new Properties();//获取Properties实例
16 InputStream inStream=getClass().getResourceAsStream("config.properties");//获取配置文件输入流
17 try{18 properties.load(inStream);//载入输入流
19 Enumeration enumeration=properties.propertyNames();//取得配置文件里所有的key值
20 while(enumeration.hasMoreElements()){21 String key=(String) enumeration.nextElement();22 System.out.println("配置文件里的key值:"+key+"=====>配置文件里的value值:"+properties.getProperty(key));//输出key值
23 }24
25 } catch(IOException e) {26 e.printStackTrace();27 }28 }29
30 }
再来个测试类:PropertiesTest.java
1 packagecom.lcw.properties.test;2
3 public classPropertiesTest {4
5 /**
6 * 测试类7 */
8 public static voidmain(String[] args) {9 PropertiesReader propertiesReader=newPropertiesReader();10 propertiesReader.getPropertiesReader();11 }12
13 }
这是配置文件信息:config.properties
color=black
animal=rabbit
food=hamburger
chinese=\u6211\u662F\u4E2D\u6587
看下运行效果:
若要写入配置i文件也很简单,这里添加一个方法:
1 //写入资源文件信息
2 public voidwriteProperties(){3 Properties properties=newProperties();4 try{5 OutputStream outputStream=new FileOutputStream("config.properties");6 properties.setProperty("number", "2015");7 properties.setProperty("song", "手写的从前");8 properties.store(outputStream, "rabbit");9 outputStream.close();10 } catch(FileNotFoundException e) {11 e.printStackTrace();12 } catch(IOException e) {13 e.printStackTrace();14 }15 }
生成文件:
#rabbit
#Wed Jan07 17:16:56 CST 2015number=2015song=\u6211\u7231\u4F60
在现在的WEB开发中不管是JAVA还是.NET大家对配置文件一定不会陌生.但它的实现原理对新手来说却又是那么的模糊.下面的内容是说明如何自定义处理配置类
所有能够处理配置节的类必须要实现IConfigurationSectionHandler接口,
他的作用是处理对特定的以前的配置节的访问。而IConfigurationSectionHandler接口很简单
只有一个object Create(object parent,object configContext,XmlNode section)方法.这个方法不需要主动的调用.
它是在ConfigurationSettings.GetConfig这个静态方法的时候自动调用的,也就是说,当你在程序中使用ConfigurationSettings.GetConfig来获取配置节的时候,.net会根据改配置节声明中所定义的类名和路径自动实例化配置节处理类,并调用Create方法.
相信了解Duwamish解决方案的朋友对下面这一段不会陌生:
1、在global.asax的Application_OnStart方法里面调用ApplicationConfiguration.OnApplicationStart静态方法,并获得应用程序根的绝对路径。void Application_OnStart() { ApplicationConfiguration.OnApplicationStart(Context.Server.MapPath( Context.Request.ApplicationPath)); string configPath = Path.Combine(Context.Server.MapPath( Context.Request.ApplicationPath ), "remotingclient.cfg"); if(File.Exists(configPath)) RemotingConfiguration.Configure(configPath); }
2、ApplicationConfiguration.OnApplicationStart静态方法里调用System.Configuration.ConfigurationSettings.GetConfig方法处理配置节:public static void OnApplicationStart(String myAppPath) { appRoot = myAppPath; System.Configuration.ConfigurationSettings.GetConfig("ApplicationConfiguration"); System.Configuration.ConfigurationSettings.GetConfig("DuwamishConfiguration"); System.Configuration.ConfigurationSettings.GetConfig("SourceViewer"); }
大家已经注意到了,程序并没有获取GetConfig返回的值,这是因为GetConfig方法会引发配置节处理程序的Create方法,
所以,只需要在Create方法中将配置值取出来就行了。
System.Configuration.ConfigurationSettings.GetConfig("ApplicationConfiguration")
这个静态方法来读取ApplicationConfiguration配置节的时候,
会相应的类来对这个配置节进行处理。
下面是我自定义的一个配置节处理类.还忘大家指教
1/**//// <summary>
2/// ConfigurationSetting 的摘要说明。
3/// </summary>
4public class ConfigurationSetting: IConfigurationSectionHandler
5![]()
{
6/**//// <summary>
7/// 配置
8/// </summary>
9protected NameValueCollection Settings;
10/**//// <summary>
11/// 默读构造函数
12/// </summary>
13public ConfigurationSetting()
14![]()
{
15//
16// TODO: 在此处添加构造函数逻辑
17//
18}
19/**//// <summary>
20///
21/// </summary>
22/// <param name="parent"></param>
23/// <param name="configContext"></param>
24/// <param name="section"></param>
25/// <returns></returns>
26public Object Create(Object parent, object configContext, XmlNode section)
27![]()
{
28![]()
29try
30![]()
{
31NameValueSectionHandler baseHandler = new NameValueSectionHandler();
32Settings = (NameValueCollection)baseHandler.Create(parent, configContext, section);
33}
34catch
35![]()
{
36Settings = null;
37}
38return null;
39}
40
41ReadSetting#region ReadSetting
42![]()
43/**//// <summary>
44/// 读取字符串类型的配置值
45/// </summary>
46/// <param name="settings">配置项</param>
47/// <param name="key">键名</param>
48/// <param name="OriginalValue">配置值</param>
49public static void ReadConfig(NameValueCollection settings, string key, ref string OriginalValue)
50![]()
{
51try
52![]()
{
53Object setting = settings[key];
54OriginalValue = (setting == null) ? OriginalValue : (string)setting;
55return ;
56}
57catch
58![]()
{
59return ;
60}
61}
62
63public static String ReadConfig(NameValueCollection settings, String key, String defaultValue)
64![]()
{
65try
66![]()
{
67Object setting = settings[key];
68![]()
69return (setting == null) ? defaultValue : (String)setting;
70}
71catch
72![]()
{
73return defaultValue;
74}
75}
76![]()
77public static bool ReadConfig(NameValueCollection settings, String key, bool defaultValue)
78![]()
{
79try
80![]()
{
81Object setting = settings[key];
82![]()
83return (setting == null) ? defaultValue : Convert.ToBoolean((String)setting);
84}
85catch
86![]()
{
87return defaultValue;
88}
89}
90![]()
91![]()
92public static int ReadConfig(NameValueCollection settings, String key, int defaultValue)
93![]()
{
94try
95![]()
{
96Object setting = settings[key];
97![]()
98return (setting == null) ? defaultValue : Convert.ToInt32((String)setting);
99}
100catch
101![]()
{
102return defaultValue;
103}
104}
105
106
107#endregion
108}
备注:
IConfigurationSectionHandler 类的实例必须是线程安全且无状态的。Create 方法必须可由多个线程同时调用。
而且,Create 生成的配置对象必须是线程安全且不可变的。而且,由于配置对象由配置系统来缓存,
因此务必要修改 Create 的父参数。
例如,如果 Create 的返回值只对父参数进行少量修改,则实际修改必须在父参数的复本上进行,而不能在原参数上进行。
参考:
微软中国社区(Duwamish深入剖析)
MSDN转载于:https://www.cnblogs.com/Mijie/archive/2007/09/13/891539.html