framework
framework copied to clipboard
V8: Reading Design files in Jetty 9.2.14 embedded wrong classpath
@DALDEI commented on Mon May 21 2018
Vaadin V8, loading designer files (Design.read()) in jetty 9.2.14 uses the wrong classpath/classloader. Perusing the history of code changes in vaadin-core it appears that the assumption for classloaders is that they will use the thead local context classloader. Jetty 9.2.14 does not do this. In Design.read the classloader is overridden with the thread local context loader. This is the System (or bootstrap) loader in jetty 9.2.14 and does not include the Vaadin runtime (atleast in my configuration).
A workaround is to swap in the current class's classloader into the thread context class loader for the duration of read(). To do so without changing the auto-generated constructor the following code works for me: (kotlin source, tested)
fun swapcls(cls: ClassLoader ) : ClassLoader =
Thread.currentThread().let {
val _cls = it.contextClassLoader
it.contextClassLoader = cls
_cls
}
Auto-generated Designer class
@DesignRoot
@AutoGenerated
@SuppressWarnings("serial")
public class CampaignInlineView extends HorizontalLayout
....
public CampaignInlineView()
{
Design.read(this);
}
...
Constructor of derived class
private class CampaignDetail(
val campaign: Campaign,
tls: ClassLoader = swapcls(CampaignDetail::class.java.getClassLoader())
) : CampaignInlineView() , View
In java this would be like this (untested)
class CampaignDetail : extends CampaignInlineView, implements View {
private CampaignDetail(Campaign impl, ClassLoader cls ) { super() ; swapcls(cls); }
public CampaignDetrail( Campaign impl ) {
this( impl ,
swapcls(CampaignDetail::class.getClassLoader() );
}
}
Hello there!
We are sorry that this issue hasn't progressed lately. We are prioritizing issues by severity and the number of customers we expect are experiencing this and haven't gotten around to fix this issue yet.
There are a couple of things you could help to get things rolling on this issue (this is an automated message, so expect that some of these are already in use):
- Check if the issue is still valid for the latest version. There are dozens of duplicates in our issue tracker, so it is possible that the issue is already tackled. If it appears to be fixed, close the issue, otherwise report to the issue that it is still valid.
- Provide more details how to reproduce the issue.
- Explain why it is important to get this issue fixed and politely draw others attention to it e.g. via the forum or social media.
- Add a reduced test case about the issue, so it is easier for somebody to start working on a solution.
- Try fixing the issue yourself and create a pull request that contains the test case and/or a fix for it. Handling the pull requests is the top priority for the core team.
- If the issue is clearly a bug, use the Warranty in your Vaadin subscription to raise its priority.
Thanks again for your contributions! Even though we haven't been able to get this issue fixed, we hope you to report your findings and enhancement ideas in the future too!
Hi @DALDEI. I would like to reproduce this issue, can you tell me how something would fail when using jetty 9.2.14, because of the wrong classloader? .. are designs not being found?
Hello there!
We are sorry that this issue hasn't progressed lately. We are prioritizing issues by severity and the number of customers we expect are experiencing this and haven't gotten around to fix this issue yet.
There are a couple of things you could help to get things rolling on this issue (this is an automated message, so expect that some of these are already in use):
- Check if the issue is still valid for the latest version. There are dozens of duplicates in our issue tracker, so it is possible that the issue is already tackled. If it appears to be fixed, close the issue, otherwise report to the issue that it is still valid.
- Provide more details how to reproduce the issue.
- Explain why it is important to get this issue fixed and politely draw others attention to it e.g. via the forum or social media.
- Add a reduced test case about the issue, so it is easier for somebody to start working on a solution.
- Try fixing the issue yourself and create a pull request that contains the test case and/or a fix for it. Handling the pull requests is the top priority for the core team.
- If the issue is clearly a bug, use the Warranty in your Vaadin subscription to raise its priority.
Thanks again for your contributions! Even though we haven't been able to get this issue fixed, we hope you to report your findings and enhancement ideas in the future too!