问题
我们Tomcat 7.0.35运行了25个webapps,它们共享相同的库,具有相同的版本(保证永远不会改变!).我想,而不是每个项目加载相同的库,我可以移动它们${catalina.home}/lib导致所需的内存负载减少.
然而,这是有代价的:每个webapp的部署时间从5秒增加到2分钟,这是不可行的!
我做了一些阅读(例如Class Loader HOW-TO),遗憾的是我无法找到减少启动时间的方法.有没有办法解决这个问题?
请求的分析信息
我跑jstack,并jvisualvm在两种不同的情况,我会在这里提出一些调查结果(请让我知道如果你需要更多的信息):
org.apache.catalina.loader.WebappClassLoader.findResourceInternal"localhost-startStop-1" daemon prio=10 tid=0x00007f17f8001800 nid=0x13b8 runnable [0x00007f183c800000]
java.lang.Thread.State: RUNNABLE
at java.text.MessageFormat.subformat(MessageFormat.java:1250)
at java.text.MessageFormat.format(MessageFormat.java:819)
at org.apache.naming.StringManager.getString(StringManager.java:145)
at org.apache.naming.resources.BaseDirContext.lookup(BaseDirContext.java:500)
at org.apache.naming.resources.ProxyDirContext.lookup(ProxyDirContext.java:310)
at org.apache.catalina.loader.WebappClassLoader.findResourceInternal(WebappClassLoader.java:3011)
at org.apache.catalina.loader.WebappClassLoader.findResource(WebappClassLoader.java:1262)
at org.apache.catalina.loader.WebappClassLoader.getResourceAsStream(WebappClassLoader.java:1499)
at org.apache.catalina.startup.ContextConfig.populateJavaClassCache(ContextConfig.java:2302)
at org.apache.catalina.startup.ContextConfig.populateJavaClassCache(ContextConfig.java:2294)
at org.apache.catalina.startup.ContextConfig.populateJavaClassCache(ContextConfig.java:2308)
at org.apache.catalina.startup.ContextConfig.populateJavaClassCache(ContextConfig.java:2291)
at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:2197)
at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2154)
at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:2034)
at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1990)
at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1976)
at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1326)
at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:882)
- locked <0x00000007f52f3ec0> (a org.apache.catalina.startup.ContextConfig)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:379)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) …Run Code Online (Sandbox Code Playgroud)我相信接口org.w3c.dom.NodeList缺少一个stream()函数来利用Java 8的Stream API的好处.考虑引入默认方法以确保向后兼容性,我无法理解为什么此接口没有stream()功能.
所以我的问题是:
NodeList结合Stream API使用?提前致谢!
编辑:我目前正在使用此实用程序包装器:
private static Stream<Node> nodeStream(NodeList list) {
List<Node> nodes = new ArrayList<>();
for (int n = 0; n < list.getLength(); ++n) {
nodes.add(list.item(n));
}
return nodes.stream();
}
Run Code Online (Sandbox Code Playgroud) 我正在使用 Terraform v1.0.0 并使用 AWS S3 和 AWS DynamoDB 创建远程后端,如Yevgeniy Brikman 的Terraform Up & Running中所述:
\nterraform applyterraform { backend "S3" {} }到我的代码中backend.hcl包含所有相关参数的文件terraform init -backend-config=backend.hcl现在我想将远程状态转换回本地状态,以便我可以安全地删除远程后端。Brikman 解释说,要做到这一点,必须删除backend配置并调用terraform init. 当我尝试这个时,我看到这个:
$ terraform init\nInitializing modules...\n\nInitializing the backend...\n\xe2\x95\xb7\n\xe2\x94\x82 Error: Backend configuration changed\n\xe2\x94\x82 \n\xe2\x94\x82 A change in the backend configuration has been detected, which may require migrating …Run Code Online (Sandbox Code Playgroud) 我已将片段添加到android导航抽屉活动中并收到此错误,我正在关注某个教程,并且在教程中工作的完全相同,我缺少什么吗?
java.lang.RuntimeException: app.com.navigatemenu.MainActivity@56e7d2c must implement OnFragmentInteractionListener
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
Run Code Online (Sandbox Code Playgroud)
主要活动
package app.com.navigatemenu;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.view.View;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
NavigationView navigationView = null;
Toolbar toolbar = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MainFragment fragment = new MainFragment();
android.support.v4.app.FragmentTransaction …Run Code Online (Sandbox Code Playgroud)