我在尝试运行命令行应用程序时遇到异常:
java.lang.ExceptionInInitializerError
at org.hibernate.validator.engine.ConfigurationImpl.<clinit>(ConfigurationImpl.java:52)
at org.hibernate.validator.HibernateValidator.createGenericConfiguration(HibernateValidator.java:43)
at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:269)
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: -2
at java.lang.String.substring(String.java:1937)
at org.hibernate.validator.util.Version.<clinit>(Version.java:39)
... 34 more
我做错了吗?请建议。
答案 0 :(得分:1)
这很奇怪。我将static
o.h.v.u.Version
初始化块的相关部分粘贴到一个带main
的类中,并添加了一些穷人的日志记录:
public class VersionTest {
public static void main(String[] args) {
Class clazz = org.hibernate.validator.util.Version.class;
String classFileName = clazz.getSimpleName() + ".class";
System.out.println(String.format("%-16s: %s", "classFileName", classFileName));
String classFilePath = clazz.getCanonicalName().replace('.', '/') + ".class";
System.out.println(String.format("%-16s: %s", "classFilePath", classFilePath));
String pathToThisClass = clazz.getResource(classFileName).toString();
System.out.println(String.format("%-16s: %s", "pathToThisClass", pathToThisClass));
// This is line 39 of `org.hibernate.validator.util.Version`
String pathToManifest = pathToThisClass.substring(0, pathToThisClass.indexOf(classFilePath) - 1)
+ "/META-INF/MANIFEST.MF";
System.out.println(String.format("%-16s: %s", "pathToManifest", pathToManifest));
}
}
这是运行时得到的输出:
classFileName : Version.class
classFilePath : org/hibernate/validator/util/Version.class
pathToThisClass : jar:file:/home/pascal/.m2/repository/org/hibernate/hibernate-validator/4.0.2.GA/hibernate-validator-4.0.2.GA.jar!/org/hibernate/validator/util/Version.class
pathToManifest : jar:file:/home/pascal/.m2/repository/org/hibernate/hibernate-validator/4.0.2.GA/hibernate-validator-4.0.2.GA.jar!/META-INF/MANIFEST.MF
在您的情况下,StringIndexOutOfBoundsException: String index out of range: -2
表示:
pathToThisClass.indexOf( classFilePath )
正在返回-1
,使pathToThisClass.substring(0, -2)
来电确实是错误的。
这意味着org/hibernate/validator/util/Version.class
在某种程度上不属于pathToThisClass
的一部分。我没有完整的解释,但这必须与你使用One-Jar的事实有关。
你能运行上面的测试类并用输出更新你的问题吗?
答案 1 :(得分:0)
因此,当您使用One-JAR时,问题可能在于One-JAR和Hibernate Validator之间的不兼容性。但是,在最新版本的One-JAR(0.97)中,它工作正常,因此使用最新版本。