Spring Maven 独立应用程序 Jar 不工作

Spring Maven Standalone application Jar not working

我用 Maven 创建了一个 Spring 独立应用程序。因此也添加了maven依赖。

如果我从命令行 运行 jar 我得到以下错误

 D:\>java -jar "myTest.jar"
Aug 31, 2016 7:20:21 PM org.springframework.context.support.ClassPathXmlApplicat
ionContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationCont
ext@74be95bf: startup date [Wed Aug 31 19:20:21 PKT 2016]; root of context hiera
rchy
Aug 31, 2016 7:20:22 PM org.springframework.beans.factory.xml.XmlBeanDefinitionR
eader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [resources/applicati
onContext.xml]
Exception in thread "main" java.lang.ExceptionInInitializerError
        at com.my.sftp.SFTPTester.main(SFTPTester
.java:78)
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: IOExc
eption parsing XML document from class path resource [resources/applicationConte
xt.xml]; nested exception is java.io.FileNotFoundException: class path resource
[resources/applicationContext.xml] cannot be opened because it does not exist
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBea
nDefinitions(XmlBeanDefinitionReader.java:344)
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBea
nDefinitions(XmlBeanDefinitionReader.java:304)
        at org.springframework.beans.factory.support.AbstractBeanDefinitionReade
r.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181)
        at org.springframework.context.support.AbstractXmlApplicationContext.loa
dBeanDefinitions(AbstractXmlApplicationContext.java:123)
        at org.springframework.context.support.AbstractXmlApplicationContext.loa
dBeanDefinitions(AbstractXmlApplicationContext.java:93)
        at org.springframework.context.support.AbstractRefreshableApplicationCon
text.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129)
        at org.springframework.context.support.AbstractApplicationContext.obtain
FreshBeanFactory(AbstractApplicationContext.java:612)
        at org.springframework.context.support.AbstractApplicationContext.refres
h(AbstractApplicationContext.java:513)
        at org.springframework.context.support.ClassPathXmlApplicationContext.<i
nit>(ClassPathXmlApplicationContext.java:197)
        at org.springframework.context.support.ClassPathXmlApplicationContext.<i
nit>(ClassPathXmlApplicationContext.java:172)
        at org.springframework.context.support.ClassPathXmlApplicationContext.<i
nit>(ClassPathXmlApplicationContext.java:158)
        at com.my.sftp.ApplicationContextProvider.<clinit>(Applicat
ionContextProvider.java:10)
        ... 1 more
Caused by: java.io.FileNotFoundException: class path resource [resources/applica
tionContext.xml] cannot be opened because it does not exist
        at org.springframework.core.io.ClassPathResource.getInputStream(ClassPat
hResource.java:172)
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBea
nDefinitions(XmlBeanDefinitionReader.java:330)
        ... 12 more

    Here are the few lines of pom.xml suggesting how i am adding "resources" folder reference

    <build>
       <resources>
       <resource><directory>src/main/resources</directory></resource>
       </resources>
      <pluginManagement>
       <plugins>
        <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-compiler-plugin</artifactId>
         <version>2.3.1</version>
         <configuration>
          <source>1.7</source>
          <target>1.7</target>

         </configuration>
        </plugin>
       </plugins>
      </pluginManagement>

这是 main() 代码

public static void main(String[] args)
   {
     ConfigurableApplicationContext context = null;
     try {
       context = new ClassPathXmlApplicationContext("resources/applicationContext.xml", SFTPTester.class);
       context.getBean("sftpTester");

     } catch (Exception e) {
       e.printStackTrace();
       context.close();
     }
     catch (Throwable t) {
         t.printStackTrace();
         context.close();
       }

   }

上面给出了当前的项目结构

当您使用 maven jar 文件时,资源文件将直接位于根级别。您必须将 resources/applicationContext.xml 更改为 applicationContext.xml 才能使其正常工作。

旁注,如果您想知道 Jar 文件中的内容,请将 .jar 更改为 .zip 并提取内容。您将对正在发生的事情有更好的了解。

除了在 java main() 中更改引用上下文的行解决了问题之外,一切都与问题中的一样。现在项目在 Eclipse 调试以及 Maven 生成的 jar 文件中工作正常。 所以我将行更改为

context = new ClassPathXmlApplicationContext("applicationContext.xml");