c3p0 com.mchange.v2.lang.VersionUtils: java.version ''1.6.0_03-p4'' could not be parsed. Defaulting to JDK 1.1

When playing with JForum I have noticed a small annoyance in the log:

java.version ''1.6.0_03-p4'' could not be parsed. Defaulting to JDK 1.1

(This problem has also been reported on some Russian forum).

I have four JDK's installed on my machine:

FreeBSD JDK 1.5 compiled from source:

java version "1.5.0_13-p7"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_13-p7-root_03_dec_2007_00_10)
Java HotSpot(TM) 64-Bit Server VM (build 1.5.0_13-p7-root_03_dec_2007_00_10, mixed mode)

Diablo FreeBSD JDK 1.5 binary:

java version "1.5.0"
Java(TM) 2 Runtime Environment, Standard Edition (build diablo-1.5.0-b01)
Java HotSpot(TM) 64-Bit Server VM (build diablo-1.5.0_07-b01, mixed mode)

FreeBSD JDK 1.6 compiled from source:

java version "1.6.0_03-p4"
Java(TM) SE Runtime Environment (build 1.6.0_03-p4-saper_24_feb_2008_06_54-b00)
Java HotSpot(TM) 64-Bit Server VM (build 1.6.0_03-p4-saper_24_feb_2008_06_54-b00, mixed mode)

and the Linux Sun JDK 1.5 running under Linux ABI emulation for the FreeBSD:

java version "1.5.0_15"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_15-b04)
Java HotSpot(TM) Server VM (build 1.5.0_15-b04, mixed mode)

As the J2SE SDK/JRE Version String Naming Convention specification says, all non-FCS (First Customer Shipment) i.e. unofficial or patched builds should contain the identifier after a dash and it does not have to be numeric.

The FreeBSD port is using this to determine which Java2 patchset has been applied to the original source when compiling.

Therefore I would suggest a small patch to com.mchange.v2.lang.VersionUtils class (this one can be applied to the source code of c3p0 0.9.1.2 version):

--- a/src/classes/com/mchange/v2/lang/VersionUtils.java Fri Jul 25 16:26:56 2008 +0200
+++ b/src/classes/com/mchange/v2/lang/VersionUtils.java Fri Jul 25 17:44:44 2008 +0200
@@ -49,7 +49,7 @@
            }
        else
            {
-               try { v = extractVersionNumberArray( vstr, "._" ); }
+               try { v = extractVersionNumberArray( vstr ); }
                catch ( NumberFormatException e )
                    {
                        if (logger.isLoggable( MLevel.WARNING ))
@@ -137,11 +137,20 @@
     public static boolean isAtLeastJavaVersion15()
     { return (JDK_VERSION >= 15); }
 
-    public static int[] extractVersionNumberArray(String versionString, String delims)
+    private static String upTo(String s, char delimiter) {
+       int k = s.indexOf(delimiter);
+       if (k >= 0) {
+               return s.substring(0, k);
+       } else {
+               return s;
+       }
+    }
+
+    public static int[] extractVersionNumberArray(String versionString)
        throws NumberFormatException
     {
-       String[] intStrs = StringTokenizerUtils.tokenizeToArray( versionString, delims, false );
-       int len = intStrs.length;
+       String[] intStrs = StringTokenizerUtils.tokenizeToArray( upTo(versionString, '-'), "._", false );
+       int len = intStrs.length;
        int[] out = new int[ len ];
        for (int i = 0; i < len; ++i)
            out[i] = Integer.parseInt( intStrs[i] );
@@ -179,4 +188,4 @@
        else
            return 0;
     }

And a small test case in Jython (don't forget to put the c3p0 jar file on your classpath):

from com.mchange.v2.lang import VersionUtils
import java, jarray
from jarray import array


for (v, expected) in [ ("1.3.0", [1, 3, 0]),
          ("1.3beta", None),
          ("1.3.1beta", None),
          ("1.3.1-beta", [1, 3, 1]),
          ("1.3.1_05-ea", [1, 3, 1, 5]),
          ("1.4.2", [1, 4, 2]),
          ("1.5.0", [1, 5, 0]),
          ("1.5.0_13-p7", [1, 5, 0, 13]),
          ("1.6.0", [1, 6, 0]),
          ("1.6.0_02", [1, 6, 0, 2]),
          ("1.6.0_03-p4", [1, 6, 0, 3])
        ]:
        if expected:
                expected = array(expected, 'i')
        try:
                result = VersionUtils.extractVersionNumberArray(v)
        except java.lang.NumberFormatException:
                result = None
        if result == expected:
                print "OK %s: %s" % (v, result)
        else:
                print "FAILED %s: got %s expected %s" % (v, result, expected)

Odpowiedzi

What's your java version string?

Can you provide your java version string?

Thanks Marcin, this small

Thanks Marcin, this small annoyance is giving me lots of headache.

219301 2008-12-23 03:51:34,674 ERROR [AbstractStep.java:215] Encountered an error executing the step: class java.lang.NullPointerException: com/mchange/v2/l ang/VersionUtils

219302 java.lang.NullPointerException: com/mchange/v2/lang/VersionUtils

219303 at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:104)

219304 at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:65)

219305 at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:62)

219306 at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:531)

219307 at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128)

219308 at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:82)

219309 at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:423)

219310 at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)

219311 at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:139)

219312 at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1547)

219313 at org.hibernate.loader.Loader.doQuery(Loader.java:673)

219314 at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)

219315 at org.hibernate.loader.Loader.doList(Loader.java:2213)

219316 at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)

219317 at org.hibernate.loader.Loader.list(Loader.java:2099)

219318 at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:94)

219319 at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1569)

219320 at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)

219321 at org.hibernate.impl.CriteriaImpl.uniqueResult(CriteriaImpl.java:305)

219322 at uk.co.shopzilla.sem.sputnik.structurizer.dao.hibernate.HibernateBaseDao.findUniqueByProperty(HibernateBaseDao.java:89)

219323 at uk.co.shopzilla.sem.sputnik.structurizer.dao.hibernate.HibernateCampaignDAO.findCampaignName(HibernateCampaignDAO.java:26)

219324 at uk.co.shopzilla.sem.sputnik.structurizer.namer.NameFinder.findCampaignName(NameFinder.java:185)

219325 at uk.co.shopzilla.sem.sputnik.structurizer.account.AccountCreator.createAccount(AccountCreator.java:143)

219326 at uk.co.shopzilla.sem.sputnik.structurizer.AccountFitterItemReader.read(AccountFitterItemReader.java:127)

219327 at uk.co.shopzilla.sem.sputnik.structurizer.AccountFitterItemReader.read(AccountFitterItemReader.java:40)

219328 at org.springframework.batch.core.step.item.AbstractItemOrientedTasklet.doRead(AbstractItemOrientedTasklet.java:71)

219329 at org.springframework.batch.core.step.item.SimpleChunkOrientedTasklet$1.doInIteration(SimpleChunkOrientedTasklet.java:46)

219330 at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:352)

219331 at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:212)

219332 at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:143)

219333 at org.springframework.batch.core.step.item.SimpleChunkOrientedTasklet.execute(SimpleChunkOrientedTasklet.java:43)

219334 at org.springframework.batch.core.step.tasklet.TaskletStep$2.doInIteration(TaskletStep.java:261)

219335 at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:352)

219336 at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:212)

219337 at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:143)

219338 at org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:232)

219339 at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:193)

219340 at org.springframework.batch.core.job.SimpleJob.handleSteps(SimpleJob.java:160)

219341 at org.springframework.batch.core.job.SimpleJob.execute(SimpleJob.java:70)

219342 at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:101)

219343 at org.springframework.scheduling.timer.DelegatingTimerTask.run(DelegatingTimerTask.java:66)

219344 at java.util.TimerThread.mainLoop(Timer.java:512)

219335 at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:352)

219336 at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:212)

219337 at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:143)

219338 at org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:232)

219339 at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:193)

219340 at org.springframework.batch.core.job.SimpleJob.handleSteps(SimpleJob.java:160)

219341 at org.springframework.batch.core.job.SimpleJob.execute(SimpleJob.java:70)

219342 at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:101)

219343 at org.springframework.scheduling.timer.DelegatingTimerTask.run(DelegatingTimerTask.java:66)

219344 at java.util.TimerThread.mainLoop(Timer.java:512)

219345 at java.util.TimerThread.run(Timer.java:462)

Dodaj nową odpowiedź

  • Adresy internetowe są automatycznie zamieniane w odnośniki, które można kliknąć.
  • Dozwolone znaczniki HTML: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Znaki końca linii i akapitu dodawane są automatycznie.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>.
  • Internal paths in double quotes, written as "internal:node/99", for example, are replaced with the appropriate absolute URL or relative path.

Więcej informacji na temat formatowania