コンパイラー準拠レベル1.5でコンパイルされたSpring/Javaアプリがあります。
Apache Tomcat 8.0.8をダウンロードした新しいLinuxセットアップがあります。
JDK 8u5をダウンロードしました。
次のようにbashでパスを設定します。
PATH=$PATH:$HOME/jdk1.8.0_05/bin
export PATH
Javaバージョンレポート:
Java version "1.8.0_05"
Java(TM) SE Runtime Environment (build 1.8.0_05-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.5-b02, mixed mode)
Setnenv.shで設定します(Tomcatの場合):
JDK_HOME=/home/userid/jdk1.8.0_05
WARファイルをデプロイすると、以下のエラーが発生します。 Tomcatは、インストールしたJavaを使用していないようです。セットアップ手順に従いました。 PS:また、JDKの代わりにJREを試しましたが、同じ問題がありました。
22-May-2014 11:34:54.070 INFO [http-nio-8080-exec-4] org.Apache.catalina.core.ApplicationContext.log Initializing Spring root WebApplicationContext
22-May-2014 11:34:54.512 SEVERE [http-nio-8080-exec-4] org.Apache.catalina.core.StandardContext.listenerStart Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from file [/home/userid/Apache-Tomcat-8.0.8/webapps/myApplication-QA/WEB-INF/classes/config/spring/securityContext.xml]; nested exception is **Java.lang.IllegalStateException: Context namespace element 'annotation-config' and its parser class [org.springframework.context.annotation.AnnotationConfigBeanDefinitionParser] are only available on JDK 1.5 and higher**
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.Java:420)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.Java:342)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.Java:310)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.Java:143)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.Java:178)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.Java:149)
at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.Java:124)
at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.Java:92)
at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.Java:123)
at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.Java:423)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.Java:353)
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.Java:255)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.Java:199)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.Java:45)
at org.Apache.catalina.core.StandardContext.listenerStart(StandardContext.Java:4750)
at org.Apache.catalina.core.StandardContext.startInternal(StandardContext.Java:5170)
at org.Apache.catalina.util.LifecycleBase.start(LifecycleBase.Java:150)
at org.Apache.catalina.manager.ManagerServlet.start(ManagerServlet.Java:1270)
at org.Apache.catalina.manager.HTMLManagerServlet.start(HTMLManagerServlet.Java:673)
at org.Apache.catalina.manager.HTMLManagerServlet.doPost(HTMLManagerServlet.Java:221)
at javax.servlet.http.HttpServlet.service(HttpServlet.Java:644)
at javax.servlet.http.HttpServlet.service(HttpServlet.Java:725)
at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:301)
at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:206)
at org.Apache.catalina.filters.CsrfPreventionFilter.doFilter(CsrfPreventionFilter.Java:213)
at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:239)
at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:206)
at org.Apache.Tomcat.websocket.server.WsFilter.doFilter(WsFilter.Java:52)
at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:239)
at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:206)
at org.Apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.Java:108)
at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:239)
at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:206)
at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:219)
at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:106)
at org.Apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.Java:615)
at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:136)
at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:78)
at org.Apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.Java:610)
at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:88)
at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:526)
at org.Apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.Java:1033)
at org.Apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.Java:652)
at org.Apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.Java:222)
at org.Apache.Tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.Java:1566)
at org.Apache.Tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.Java:1523)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.Apache.Tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.Java:61)
at Java.lang.Thread.run(Unknown Source)
Caused by: Java.lang.IllegalStateException: Context namespace element 'annotation-config' and its parser class [org.springframework.context.annotation.AnnotationConfigBeanDefinitionParser] are only available on JDK 1.5 and higher
at org.springframework.context.config.ContextNamespaceHandler$1.parse(ContextNamespaceHandler.Java:65)
at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.Java:69)
at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.Java:1253)
at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.Java:1243)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.Java:135)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.Java:92)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.Java:507)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.Java:398)
... 49 more
22-May-2014 11:34:54.518 INFO [http-nio-8080-exec-4] org.Apache.catalina.core.ApplicationContext.log Closing Spring root WebApplicationContext
例外をスローしているクラスは、このコードを使用してJavaバージョンを確認しています。
static {
javaVersion = System.getProperty("Java.version");
// version String should look like "1.4.2_10"
if (javaVersion.indexOf("1.7.") != -1) {
majorJavaVersion = Java_17;
}
else if (javaVersion.indexOf("1.6.") != -1) {
majorJavaVersion = Java_16;
}
else if (javaVersion.indexOf("1.5.") != -1) {
majorJavaVersion = Java_15;
}
else {
// else leave 1.4 as default (it's either 1.4 or unknown)
majorJavaVersion = Java_14;
}
}
そのため、Spring 2.5が最初にリリースされたとき、コードは1.7以降のJavaバージョンで実行されることを想定していませんでした。 Java 8以降の場合、上記のコードはデフォルトの1.4バージョンを想定しています。このため、注釈部分は文句を言います。
Springバージョンをアップグレードするか、Java 7を使用する必要があると思います。 Spring 2.5はEOLされました とにかくかなり長い間。
同様の問題があります。 Spring 2.5.5での古いSpring MVC/Spring Facesアプリケーションは、Java 8では実行されません。
Java 8を実行する必要があるため、解決策を見つけるために数日を費やしました。
最初のアイデアは、Springパッケージ全体を4.1.6までアップグレードすることでした。私はMavenを使用しました。この方法の問題は、その後、ほぼプロジェクト全体をやり直す必要があるということです。たとえば、Spring 4ではJSF実装が削除され、<sf:..>
などの完全に削除された特別なtaglibがいくつか削除されたためです。そして、構成、アダプター、ハンドラー、マッピングに関する、より大きな問題と小さな問題がありました。
2番目のアプローチは、Spring JARを部分的に置き換えることでした。再び成功しません。依存関係に触れずにjarを置き換えることはできません。
苦労して数週間または数ヶ月経った後、私は両方のアプローチで成功することができると信じています。しかし、そんなに時間はありません。そしてあきらめました。私の解決策は次のとおりです。
Org.springframework.coreパッケージからソースファイルJdkVersion.Javaを見つけました。 http://www.Java2s.com/Code/Jar/o/Downloadorgspringframeworkcoresources300releasejar.htm 。プロジェクトでorg.springframework.coreパッケージを作成し、クラスJdkVersionを1つだけ作成しました。その後、コードを簡単に変更してJava 8バージョンを確認しました。そのようなSmth:
public static final int Java_18 = 5;
...
javaVersion = System.getProperty("Java.version");
// version String should look like "1.4.2_10"
if (javaVersion.contains("1.8.")) {
majorJavaVersion = Java_18;
System.out.println("Java_VERSION: "+javaVersion);
} else if (javaVersion.contains("1.7.")) {
majorJavaVersion = Java_17;
}
このコードの変更でさえ、実際に必要なわけではなく、単に楽しみのためだけです。これは、このソースがSpring 3.0.0パッケージからのものであり、Springの人がJavaバージョンチェックをすでに変更しているためです。 7より高いバージョンは、古いJavaとは見なされません。
これで、アプリケーションが正常に起動します。 jarの代わりにプロジェクトからJdkVersionクラスを呼び出します。
これまでのところ動作します!この考えを与えてくれたこのスレッドからのすべてに感謝します。
ありがとう
Java 8でSpring 2.5.5をサポートする必要があるため、 この回答 からのアプローチを使用して、JdkVersion.class
の将来のドロップイン置換を提供しました。できるだけ少ない副作用(他の誰も完全なクラスを投稿せず、他の回答をハイジャックしたくありませんでした)。 Java 8を確認する必要はありません。単にデフォルトでJava 7になります。これは、クラスが管理する最高バージョンです。
Jarファイルを抽出します。
mkdir spring
cd spring
jar xvf ../spring.jar
META-INF/MANIFEST.MF
でSpringバージョンを確認します(version=2.5.5
のようなものが表示されるはずです)。 適切なバージョン のJdkVersion.Java
を検索し、それを出発点として使用します(以下の例はSpring 2.5.5であり、バージョンからメソッドシグネチャを変更したくない場合「で作業しています)。
JdkVersion.class
ファイルのメジャーバージョンとマイナーバージョンを確認します。
javap -verbose org/springframework/core/JdkVersion.class
クラスが元のターゲットとしてコンパイルされたことがわかります48.0( これを見上げて 、それはJava 1.4):
Classfile /tmp/spring/org/springframework/core/JdkVersion.class
Last modified Jun 23, 2008; size 1286 bytes
MD5 checksum 98e6ea08ce9186c50cc71d14465fc3dd
Compiled from "JdkVersion.Java"
public abstract class org.springframework.core.JdkVersion
minor version: 0
major version: 48
flags: ACC_PUBLIC, ACC_SUPER, ACC_ABSTRACT
Constant pool:
...
次の内容でorg/springframework/core/JdkVersion.Java
を作成します。
package org.springframework.core;
public abstract class JdkVersion
{
public static final int Java_13 = 0;
public static final int Java_14 = 1;
public static final int Java_15 = 2;
public static final int Java_16 = 3;
public static final int Java_17 = 4;
private static final String javaVersion;
private static final int majorJavaVersion;
static
{
javaVersion = System.getProperty("Java.version");
if (javaVersion.indexOf("1.7.") != -1)
{
majorJavaVersion = Java_17;
} else if (javaVersion.indexOf("1.6.") != -1) {
majorJavaVersion = Java_16;
} else if (javaVersion.indexOf("1.5.") != -1) {
majorJavaVersion = Java_15;
} else if (javaVersion.indexOf("1.4.") != -1) { // new
majorJavaVersion = Java_14; // new
} else {
majorJavaVersion = Java_17; // changed from Java_14
}
}
public static String getJavaVersion()
{
return javaVersion;
}
public static int getMajorJavaVersion()
{
return majorJavaVersion;
}
public static boolean isAtLeastJava14()
{
return true;
}
public static boolean isAtLeastJava15()
{
return getMajorJavaVersion() >= Java_15;
}
public static boolean isAtLeastJava16()
{
return getMajorJavaVersion() >= Java_16;
}
}
次に、新しいクラスをJava 1.4としてコンパイルします。
javac -source 1.4 org/springframework/core/JdkVersion.Java
必要に応じて、上記のようにmajor.minorバージョンを再度確認できます。
変更されたjarファイルを作成します(元のマニフェストを上書きせずに):
jar Mcf ../spring-modified.jar *
必要に応じて(spring.jar
または必要に応じて)変更したjarファイルをコピーします。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>2.5.6</version>
TO =>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.4.RELEASE</version>
</dependency>
OR
私は同じ問題を抱えていましたが、解決策があります:
プロジェクトファイルpom.xmlで以下を置き換えます。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>2.5.6</version>
</dependency>
ために:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.4.RELEASE</version>
</dependency>
そしてあなたの問題に別れを告げる!!
この2つの依存関係は、大部分のfirts依存関係の代替です。
スプリングバージョンを2.5から3.2.3以上に移行します。
Springの移行では、次の変更を行う必要があります-
1)pom.xmlで、spring 2.5.6の依存関係を削除し、springの新しいバージョンの依存関係を追加します。
2)プロジェクトのapplicationcontet.xmlファイルのbeansタグの「xsi:schemaLocation」を更新します。
例 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd to http://www.springframework.org/schema/beans/spring -beans-3.2.xsd Spring 3.2.3バージョンの場合。
3)プロジェクトをクリーンアップ、ビルド、および再デプロイします。
私は、Spring 2.5をまだ使用している非常に古いプロジェクト(2008年に開発されました!)の別の不幸なユーザーであることがあります。また、Mavenプロジェクトでもないため、Springの以降のバージョンへのアップグレードには時間がかかり、依存関係が失敗してビルドエラーが発生していました。 Tomcat JREを1.7にダウングレードしたところ、うまく機能しました。
誰かが助けを必要とする場合に備えて、Eclipseでそれを行う方法を文書化するだけです:
Java 7がまだない場合は、JDK 7をダウンロードして、C:\Program Files\Java\jdk1.7.0_71
などの場所にインストールします
次に、Eclipseに移動し、Servers > Tomcat vX.Y server
をダブルクリックします
Runtime Environment
をクリックしてからInstalled JREs
をクリックします
次にAdd
> Standard VM
をクリックし、Next
をクリックします。次のようなウィンドウが表示されます。
Directory...
をクリックして、JDKをインストールしたフォルダーを参照します(つまり、C:\Program Files\Java\jdk1.7.0_71
。JDKは問題ありません。JREは不要です)。 Finish
をクリックします。
次に、Java 7のJREを選択して、すべての設定が完了したことを確認します。
私は同じ問題に直面していました。しかし、非常に一生懸命努力した後、これはJava 1.8を使用していることが原因であることがわかりました。私はそれを1.6に変更し、それが機能しました。
this answer の完全自動バージョンを作成しました。彼が対処する微妙さについては、最初にその投稿を読んでください。
spring.jar
ファイルの隣にbuild.xml
をコピーしますbuild.xml
ファイルの内容:
<project name="spring-patch" default="patch">
<target name="patch">
<mkdir dir="src/org/springframework/core"/>
<get dest="src/org/springframework/core/JdkVersion.Java"
src="http://grepcode.com/file_/repo1.maven.org/maven2/org.springframework/spring/2.5.5/org/springframework/core/JdkVersion.Java/?v=source&disposition=attachment" />
<replace dir="src" value="majorJavaVersion = Java_17">
<replacetoken>majorJavaVersion = Java_14</replacetoken>
</replace>
<javac srcdir="src" />
<Zip destfile="spring.jar" update="true">
<fileset dir="src" includes="**/*.class" />
</Zip>
<delete dir="src" />
</target>
</project>
この答えは完全に回答されていますが、場合によっては、JavaバージョンまたはSpringバージョンをアップグレードすることが望ましくないか、不可能です。
私たちの場合、JDK 8を使用してSonar(Jenkinsから)と通信できるようにする必要があり、このアップグレードをテストするためのテスト能力がないため、spring-versionを変更したくありません。
私たちの解決策は、ビルド中にJavaバージョンを単にオーバーライドすることでした。
-Djava.version=1.6.45
Spring2.5にJava1.8とJava1.9のサポートを追加しました。 tomacat libのファイルを置き換えてください。 JdkVersion.class-変更