]
Thomas Siegbert edited comment on HHH-7254 at 4/17/12 7:10 AM:
---------------------------------------------------------------
The old unit-test file (17/Apr/12 6:40 AM) can be deleted.
was (Author: mille4ever):
The old unit-tests file (17/Apr/12 6:40 AM) can be deleted.
Using Eclipse's JarResrcLoader, an exception occurs:
java.lang.StringIndexOutOfBoundsException: String index out of range: -1
-----------------------------------------------------------------------------------------------------------------------------
Key: HHH-7254
URL:
https://hibernate.onjira.com/browse/HHH-7254
Project: Hibernate ORM
Issue Type: Bug
Components: entity-manager
Affects Versions: 3.6.10, 4.1.1
Environment: Hibernate Core 3.6.10, Windows 7 Enterprise, Java SE 1.6.31, DB:
Oracle 11.2.0.2, IDE: Eclipse Indigo
Reporter: Thomas Siegbert
Labels: JarResrcLoader, hibernate, jar
Attachments: export_jar_in_jar.jar, export_libs_outside.rar,
JarVisitorFactoryTest.java, JarVisitorFactoryTest.java, log.txt, log.txt
Original Estimate: 8h
Remaining Estimate: 8h
We have a project with a lot of jars. For delivering, we want to pack all jars and the
binary code in one executable jar.
To build this executable jar, we use the export-functionality from Eclipse. In the wizard
in Eclipse, we use the following option for "Library handling": "Package
required libraries into generated JAR".
If I call this generated executable jar, I will get the following exception:
{quote}
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at
org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: javax.persistence.PersistenceException: Unable to configure
EntityManagerFactory
at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:378)
at
org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47)
at my.project.Main.main(Main.java:20)
... 5 more
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(Unknown Source)
at
org.hibernate.ejb.packaging.JarVisitorFactory.getJarURLFromURLEntry(JarVisitorFactory.java:55)
at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java: 344)
... 9 more
{quote}
If I do not pack all jars in one jar (instead, I use a sub-folder outside the jar
containing all libs), the program works fine.
Probably, I have already identified the issue:
In the method
"_org.hibernate.ejb.packaging.JarVisitorFactory.getJarURLFromURLEntry_" there is
the following code line:
{quote} file = file.substring( 0, file.length() - entry.length() ); {quote}
This works fine, if _file.length()_ is equal or greater than _entry.length()_. In my case
("Jars-in-Jar") the variables in this method got the following content:
{quote}
file := META-INF/persistence.xml
entry := /META-INF/persistence.xml
url.toString := rsrc:META-INF/persistence.xml
{quote}
Thus, _file.length()_ < _entry.length()_ and the exception will be raised.
In our project, we fixed it as follows:
{quote} file = file.substring( 0, *Math.max( 0, file.length() - entry.length() )* );
{quote}
But this is only a suggestion and we cannot foresee any side effects (especially, we do
not use an application server).
I attached the following files:
* JarVisitorFactoryTest.java -> Unit-Tests (which fails using 3.6.10)
* export_jar_in_jar.jar -> For reproduction (exception will raised). It is a small
project.
* export_libs_outside.rar -> Please unpack. This version works fine, because the libs
are not within the jar.
* log.txt -> stacktrace of the exception.
--
This message is automatically generated by JIRA.
For more information on JIRA, see: