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

Andrew Garcia edited comment on GROOVY-7623 at 8/30/16 2:19 PM:
----------------------------------------------------------------

For anyone who is attempting to use the IBM JDK 8 for a grails project, here is 
how I did it in my development environment for a Grails 2.5.5 project.  I'm 
sure there is a lower common denominator of a solution but, this is what I did. 
 I'm currently deploying to Heroku in production and developing on Mac OSX so 
it made things a little trickier since I didn't have a Linux environment handy 
to unpack the .bin from IBM.  

Once you've got the .tar.gz in hand, I had to untar it, remove jre/lib/xml.jar 
since it's using old versions of xerces/xalan/etc classes and weren't playing 
nice with my Grails 2.5.5 project.  Then, I added the following files into 
jre/lib/endorsed:

jaxp-api-1.4.2.jar, serializer-2.7.2.jar, xalan-2.7.2.jar, 
xercesImpl-2.9.1.jar, xml-apis-1.3.04.jar

Now, there's a fun little piece of code in ClasspathConfigurer that likes to 
force you to use a particular javax.xml.parsers.DocumentBuilderFactory if 
Grails finds a xercesImpl dependency (transitive or not) in your BuildConfig.  
And, ClasspathConfigurer gets invoked when using ./grailsw (which Heroku makes 
use of). So, that's why I "had" to put xercesImpl in the endorsed lib instead 
of just using the version in my project.  I attempted to use the IBM JDK as it 
was combined with Heroku's support for a .jdk-overlay directory but it wasn't 
strong enough of an override.

{code:title=ClasspathConfigurer.java|borderStyle=solid}
protected void addDependenciesToURLs(Set<String> excludes, List<URL> urls, 
List<File> runtimeDeps) throws MalformedURLException {
        if (runtimeDeps == null) {
            return;
        }

        for (File file : runtimeDeps) {
            if (file == null ) {
                continue;
            }


            if (file.getName().contains("xercesImpl")) {
                // workaround for GRAILS-9708
                
System.setProperty("javax.xml.parsers.DocumentBuilderFactory","com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
            }
            if (excludes != null && !excludes.contains(file.getName())) {
                URL url = file.toURI().toURL();
                if (urls.contains(url)) continue;

                urls.add(url);
                excludes.add(file.getName());
            }
        }
    }
{code}

In my BuildConfig.groovy I had to add setting the following dependencies:

{code}
runtime ('org.codehaus.groovy.modules.http-builder:http-builder:0.7.1') 
{excludes 'xercesImpl'}

runtime "xalan:xalan:2.7.2"

runtime "com.fasterxml.woodstox:woodstox-core:5.0.3"
{code}

The xercesImpl exclusion I explained and the woodstox is because the xml.jar 
IBM had included some streaming XML class files that needed replenishing.

Then......

After I re-tared up the IBM JDK with the xml.jar removed and my other jars 
inserted I was able to start the Heroku server and get past the step of grailsw 
that auto-generates the war file. 

Then....

 I ran into the problem where IBM's JSSE loves to default to using TLS 1.0 and 
my integration with Stripe was failing since that requires TLSv1.2 "or higher". 
 After some more headbanging I ran into this IBM support doc that was 
satisfyingly infuriating.  I was simultaneously pissed they made the choice not 
to operate like every other JDK but at least they made it possible to play nice.

{quote}
Use the system property com.ibm.jsse2.overrideDefaultTLS to match the behavior 
of SSLContext.getInstance("TLS") in the IBM SDK with the Oracle implementation.

com.ibm.jsse2.overrideDefaultTLS =true|false
{quote}
from [IBM 
Support|http://www.ibm.com/support/knowledgecenter/SSYKE2_8.0.0/com.ibm.java.security.component.80.doc/security-component/jsse2Docs/matchsslcontext_tls.html#matchsslcontext_tls]

After all of that and I'm still not seeing the classes get garbage collected.  
I pray it's because I'm somehow misusing groovy.use.classvalue=true

!Screen Shot 2016-08-30 at 10.11.18 AM.png!


was (Author: gsandrew):
For anyone who is attempting to use the IBM JDK 8 for a grails project, here is 
how I did it in my development environment for a Grails 2.5.5 project.  I'm 
sure there is a lower common denominator of a solution but, this is what I did. 
 I'm currently deploying to Heroku in production and developing on Mac OSX so 
it made things a little trickier since I didn't have a Linux environment handy 
to unpack the .bin from IBM.  

Once you've got the .tar.gz in hand, I had to untar it, remove jre/lib/xml.jar 
since it's using old versions of xerces/xalan/etc classes and weren't playing 
nice with my Grails 2.5.5 project.  Then, I added the following files into 
jre/lib/endorsed:

jaxp-api-1.4.2.jar, serializer-2.7.2.jar, xalan-2.7.2.jar, 
xercesImpl-2.9.1.jar, xml-apis-1.3.04.jar

Now, there's a fun little piece of code in ClasspathConfigurer that likes to 
force you to use a particular javax.xml.parsers.DocumentBuilderFactory if 
Grails finds a xercesImpl dependency (transitive or not) in your BuildConfig.  
And, ClasspathConfigurer gets invoked when using ./grailsw (which Heroku makes 
use of). So, that's why I "had" to put xercesImpl in the endorsed lib instead 
of just using the version in my project.  I attempted to use the IBM JDK as it 
was combined with Heroku's support for a .jdk-overlay directory but it wasn't 
strong enough of an override.

{code:title=ClasspathConfigurer.java|borderStyle=solid}
protected void addDependenciesToURLs(Set<String> excludes, List<URL> urls, 
List<File> runtimeDeps) throws MalformedURLException {
        if (runtimeDeps == null) {
            return;
        }

        for (File file : runtimeDeps) {
            if (file == null ) {
                continue;
            }


            if (file.getName().contains("xercesImpl")) {
                // workaround for GRAILS-9708
                
System.setProperty("javax.xml.parsers.DocumentBuilderFactory","com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
            }
            if (excludes != null && !excludes.contains(file.getName())) {
                URL url = file.toURI().toURL();
                if (urls.contains(url)) continue;

                urls.add(url);
                excludes.add(file.getName());
            }
        }
    }
{code}

In my BuildConfig.groovy I had to add setting the following dependencies:

{code}
runtime ('org.codehaus.groovy.modules.http-builder:http-builder:0.7.1') 
{excludes 'xercesImpl'}

runtime "xalan:xalan:2.7.2"

runtime "com.fasterxml.woodstox:woodstox-core:5.0.3"
{code}

The xercesImpl exclusion I explained and the woodstox is because the xml.jar 
IBM had included some streaming XML class files that needed replenishing.

Then......

After I re-tared up the IBM JDK with the xml.jar removed and my other jars 
inserted I was able to start the Heroku server and get past the step of grailsw 
that auto-generates the war file. 

Then....

 I ran into the problem where IBM's JSSE loves to default to using TLS 1.0 and 
my integration with Stripe was failing since that requires TLSv1.2 "or higher". 
 After some more headbanging I ran into this IBM support doc that was 
satisfyingly infuriating.  I was simultaneously pissed they made the choice not 
to operate like every other JDK but at least they made it possible to play nice.

{quote}
Use the system property com.ibm.jsse2.overrideDefaultTLS to match the behavior 
of SSLContext.getInstance("TLS") in the IBM SDK with the Oracle implementation.

com.ibm.jsse2.overrideDefaultTLS =true|false
{quote}
from [IBM 
Support|http://www.ibm.com/support/knowledgecenter/SSYKE2_8.0.0/com.ibm.java.security.component.80.doc/security-component/jsse2Docs/matchsslcontext_tls.html#matchsslcontext_tls]

After all of that and I'm still not seeing the classes get garbage collected.  

!Screen Shot 2016-08-30 at 10.11.18 AM.png!

> IBM Java (J9) ClassValue works correctly so should use it by default
> --------------------------------------------------------------------
>
>                 Key: GROOVY-7623
>                 URL: https://issues.apache.org/jira/browse/GROOVY-7623
>             Project: Groovy
>          Issue Type: Bug
>    Affects Versions: 2.4.5
>            Reporter: Craig
>            Assignee: Pascal Schumacher
>             Fix For: 2.4.6
>
>         Attachments: Screen Shot 2016-08-30 at 10.11.18 AM.png
>
>
> GROOVY-7591 disabled the use of java.lang.ClassValue by default due to a bug 
> in OpenJDK: https://bugs.openjdk.java.net/browse/JDK-8136353 The result is 
> that GROOVY-6704 occurs on all versions of Java again.
> The bug in OpenJDK does not impact IBM Java, so when running on IBM Java, 
> java.lang.ClassValue should be used by default.  So at least users on IBM 
> Java will not experience GROOVY-6704.



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

Reply via email to