Это странно.Я вставил соответствующие части 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.
Не могли бы вы запустить тестовый класс выше и обновить свой вопрос с выводом?