You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Jochen Theodorou (JIRA)" <ji...@apache.org> on 2017/01/12 06:48:52 UTC

[jira] [Commented] (GROOVY-8044) MissingPropertyException for java style local variables

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

Jochen Theodorou commented on GROOVY-8044:
------------------------------------------

can you do {code:Java}
import de.my.package.lib.myJavaFile as JavaFile
JavaFile theJavaFile = new JavaFile()
{code}
reason being that in those declarations Groovy cannot handle lowercase class names very well

> MissingPropertyException for java style local variables
> -------------------------------------------------------
>
>                 Key: GROOVY-8044
>                 URL: https://issues.apache.org/jira/browse/GROOVY-8044
>             Project: Groovy
>          Issue Type: Bug
>          Components: groovy-runtime
>    Affects Versions: 2.4.7
>         Environment: KUbuntu16.10 but also present on Windows 7, Mac OS 10.9.5
>            Reporter: MeFisto94
>              Labels: newbie
>
> Hey Guys,
> First off: Sorry if this is a fault on my side but I highly doubt it.
> I am using Groovy to compile java and groovy files on the fly to use them as regular Class instances.
> I use my implementation of GroovyResourceLoader but I can confirm that it works, since if I break it purposely, Groovy complains about unknown class definitions during compile-time (of the script).
> So what happens is that I can successfully instantiate the freshly loaded class but as soon as I call a method which has a java style definition, it crashes during runtime.
> So a few examples:
> {code}
> @Override
>     public URL loadGroovySource(String fileName) throws MalformedURLException {
>         if (fileName.startsWith("de.my.packages")) {
>             String className = fileName.substring("de.my.packages".length()).replace('.', '/');
>             
>             for (String extension : new String[] { ".java", ".groovy" }) {
>                 File classFile = new File(basicPath, className + extension);
>                 if (classFile.exists()) {
>                     System.out.println("FOUND " + classFile.getAbsolutePath());
>                     return classFile.toURI().toURL();
>                 }
>             }
>         }
>         
>         return null;
>     }
> {code}
> Please ignore the fact that the variable names are misleading. Actually fileName should be className and className should be fileName...
> Now the code to get those Classes:
> {code}
> groovyClassLoader = new GroovyClassLoader(Thread.currentThread().getContextClassLoader());
> groovyClassLoader.setResourceLoader(new CustomGroovyResourceLoader(current));
> File f = new File(filePath);
> if (!f.exists()) {
>   throw new FileNotFoundException(filePath);
> }   
> return groovyClassLoader.parseClass(f);
> {code}
> The error now is:
> {code}
> No such property: de for class: de.my.package.script2
> Possible solutions: name
> groovy.lang.MissingPropertyException: No such property: de for class: de.my.package.script2
> Possible solutions: name
>         at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:53)
>         at org.codehaus.groovy.runtime.callsite.GetEffectivePogoPropertySite.getProperty(GetEffectivePogoPropertySite.java:87)
>         at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:307)
>         at de.my.package.script2.getInterfaceVersion(script2.java:27)
>         at java.lang.Thread.run(Thread.java:745)
> No such property: de for class: de.my.package.script2
> Possible solutions: name
> {code}
> Now my actual script file looks like this at that line:
> {code}
> de.my.package.lib.myJavaFile theJavaFile = new de.my.package.lib.myJavaFile();
> {code}
> This means that for some reason during runtime it quits after the . of de.
> Initially the code looked like this though:
> {code}
> myJavaFile theJavaFile = new myJavaFile();
> {code}
> This lead to the same Exception, I tried specifying the correct package manually to rule out some errors with the resolution (Groovy definately knows the myJavaFile class because parseClass would fail).
> Please note that my package isn't really "de.my.package", since package is a reserved keyword but I had to edit it out.
> What does work is "def theJavaFile = new myJavaFile();".
> What ALSO works is the java style definition for files available through the classpath (e.g. conventional code, anything from java.lang, ...)
> Am I probably missing some compilersettings to allow java compability?
> Thanks in Advance



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