[ 
https://issues.apache.org/jira/browse/PDFBOX-3155?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15047445#comment-15047445
 ] 

Uwe Schindler edited comment on PDFBOX-3155 at 12/8/15 8:54 PM:
----------------------------------------------------------------

Hi,

bq. Is this "planned" or already decided?

it was planned and the JEP exists since October 2015. The code is merged to 
main JDK repository and accepted by community. It is now part of public beta 
testing, otherwise we would not have seen this bug. There is no way back :-)

FYI, JIGSAW (the module system of Java 9) is not yet merged and therefore not 
finally decided, but we already tested their Jigsaw-pre-pre-builds with Lucene, 
Solr, Elasticsearch and confirmed that it works from Lucene 5.4 on.

To your code: I would suggest to simplify the whole thing - two options (you 
only want to detect Java 7 minimum (or other way round if its still java 6):

# Use {{java.sepcification.version}} (this property is what you are looking at. 
It has standardized format, consisting only of pure digits and colons). Since 
Java 1.0! :-) java.version is the version of the installed JDK/JRE package, its 
version number can be any string. It is NOT standardized. The specification is 
also what you are looking at, because it defines what the API can do. It is 
standardized. Lucene uses the following code to detect the Java version, which 
is unchanged since long time (last updates were just to add Java 9): 
<https://github.com/apache/lucene-solr/blob/trunk/lucene/core/src/java/org/apache/lucene/util/Constants.java#L56-L85>
 (it did not break, because it checks some standardized string format).
# Alternatively just look for a class which only exists in Java 7 with forName 
or look for a public method() or similar. This is easy to detect and catch with 
ClassNotFoundException/MethodNotFound. Apache Ant is using this to detect java 
versions, too. The easiest variant is the all famous method on Throwable class: 

{code:java}
public static final JRE_IS_MINIMUM_JAVA7;
static {
    // this method only exists in Java 7:
    boolean v7 = true;
    try {
      Throwable.class.getMethod("getSuppressed");
    } catch (Exception e) {
      v7 = false;
    }
    JRE_IS_MINIMUM_JAVA7 = v7;
}
{code}


was (Author: thetaphi):
Hi,

bq. Is this "planned" or already decided?

it was planned and the JEP exists since October 2015. The code is merged to 
main JDK repository and accepted by community. It is now part of public beta 
testing, otherwise we would not have seen this bug. There is no way back :-)

FYI, JIGSAW (the module system of Java 9) is not yet merged and therefore not 
finally decided, but we already tested their Jigsaw-pre-pre-builds with Lucene, 
Solr, Elasticsearch and confirmed that it works from Lucene 5.4 on.

To your code: I would suggest to simplify the whole thing - two options (you 
only want to detect Java 7 minimum (or other way round if its still java 6):

# Use {{java.sepcification.version}} (this property is what you are looking at. 
It has standardized format, consisting only of pure digits and colons). Since 
Java 1.0! :-) java.version is the version of the installed JDK/JRE package, its 
version number can be any string. It is NOT standardized. The specification is 
also what you are looking at, because it defines what the API can do. It is 
standardized. Lucene uses the following code to detect the Java version, which 
is unchanged since long time (last updates were just to add Java 9): 
<https://github.com/apache/lucene-solr/blob/trunk/lucene/core/src/java/org/apache/lucene/util/Constants.java#L56-L85>
 (it did not break, because it checks some standardized string format).

# Alternatively just look for a class which only exists in Java 7 with forName 
or look for a public method() or similar. This is easy to detect and catch with 
ClassNotFoundException/MethodNotFound. Apache Ant is using this to detect java 
versions, too. The easiest variant is the all famous method on Throwable class: 

{code:java}
public static final JRE_IS_MINIMUM_JAVA7;
static {
    // this method only exists in Java 7:
    boolean v7 = true;
    try {
      Throwable.class.getMethod("getSuppressed");
    } catch (Exception e) {
      v7 = false;
    }
    JRE_IS_MINIMUM_JAVA7 = v7;
}
{code}

> org.apache.pdfbox.util.PDFTextStripper class initialization throws 
> NumberFormatException with recent Verona-enabled Java 9 JVMs
> -------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: PDFBOX-3155
>                 URL: https://issues.apache.org/jira/browse/PDFBOX-3155
>             Project: PDFBox
>          Issue Type: Bug
>    Affects Versions: 1.8.8, 1.8.10
>            Reporter: Uwe Schindler
>            Priority: Critical
>
> Lucene/Solr runs its whole testsuite also with Java 9 EA releases to trigger 
> bugs early. In our tests (Solr + TIKA) we found out that 
> org.apache.pdfbox.util.PDFTextStripper throws a NumberFormatException in its 
> static initializer when parsing the "java.version" system property. The 
> reason for failure is a change in Java 9, where version numbers got a new 
> format.
> There are 3 problems:
> - It should not assume that all components are really a number. So it should 
> try/catch NumberFormatException and assign some "unknown" version
> - The code should really use "java.specification.version". This is 
> standardized and only contains digits.
> - The code should also be prepared to handle version numbers without minor 
> version! E.g. Java 9 only has "9" instead of "1.9" as its main version number.
> For the use case I would nuke this check and find a better workaround.
> Relying on String parsing for non-standardized system properties in a static 
> class initializer is the reason why this bug is raised to level "Critical".



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@pdfbox.apache.org
For additional commands, e-mail: dev-h...@pdfbox.apache.org

Reply via email to