同一JVM上每个java程序的单独JVM属性

同一JVM上每个java程序的单独JVM属性,java,jvm,jvm-arguments,Java,Jvm,Jvm Arguments,我在tomat主机进程中运行两个web应用程序,这意味着我认为应该有两个独立的程序,每个应用程序一个 另一件事是,这两个应用程序都使用了JVM属性,我希望它是特定于应用程序的 //common-service library used in both web-apps public class CommonService { private static Logger logger = LogManager.getLogger(CommonService.class); st

我在tomat主机进程中运行两个web应用程序,这意味着我认为应该有两个独立的程序,每个应用程序一个

另一件事是,这两个应用程序都使用了JVM属性,我希望它是特定于应用程序的

//common-service library used in both web-apps
public class CommonService {

    private static Logger logger = LogManager.getLogger(CommonService.class);

    static {
        String uuid = UUID.randomUUID().toString();
        logger.debug("CommonService initialization for {}" , uuid);
        System.setProperty("key1", "value1-"+ uuid);
    }
}
当我为每个应用程序部署WAR并查看
key1
属性的值时,它会被加载的第二个应用程序覆盖

正如我在这里展示的, 加载app1时,属性值
key1

加载app2时,属性
key1的值

但加载app2后,它会覆盖app1的
key1

上面的代码非常简单

public class Service1Servlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        CommonService commonService = new CommonService();
        System.out.println("Service1 key1= " + System.getProperty("key1"));
        PrintWriter out = resp.getWriter();
        out.println("<html>");
        out.println("<body>");
        out.println("<h1>" + System.getProperty("key1")+ "</h1>");
        out.println("</body>");
        out.println("</html>");
    }
}
公共类Service1Servlet扩展了HttpServlet{
@凌驾
受保护的void doGet(HttpServletRequest-req,HttpServletResponse-resp)抛出ServletException,IOException{
CommonService CommonService=新的CommonService();
System.out.println(“Service1 key1=“+System.getProperty(“key1”));
PrintWriter out=resp.getWriter();
out.println(“”);
out.println(“”);
out.println(“+System.getProperty(“key1”)+”);
out.println(“”);
out.println(“”);
}
}

因此,我似乎只能在单个JVM中使用全局JVM参数,但我的服务器上运行多个服务,其中每个服务都需要有自己的一组JVM参数,根据这些参数,还有另一个api实际使用该JVM属性。

对于应用程序属性,您不希望使用VM参数。正如您所发现的,这些对整个容器都是全局的。相反,您应该使用在应用程序加载时加载的属性文件。我喜欢使用的一种方法是将资源包加载到静态映射中。假设您在WEB-INF/classes目录中有一个“application.properties”文件。像这样:

//common-service library used in both web-apps
public class CommonService {

    public static Map< String, String > APPLICATION_PROPERTIES = new HashMap<>();

    static {
        ResourceBundle bundle = ResourceBundle.getBundle( "application" );
        for( String key : bundle.keySet() ) {
          APPLICATION_PROPERTIES.put( key, ( String )bundle.getObject( key ) );
        }
    }
}

对于应用程序属性,您不希望使用VM参数。正如您所发现的,这些对整个容器都是全局的。相反,您应该使用在应用程序加载时加载的属性文件。我喜欢使用的一种方法是将资源包加载到静态映射中。假设您在WEB-INF/classes目录中有一个“application.properties”文件。像这样:

//common-service library used in both web-apps
public class CommonService {

    public static Map< String, String > APPLICATION_PROPERTIES = new HashMap<>();

    static {
        ResourceBundle bundle = ResourceBundle.getBundle( "application" );
        for( String key : bundle.keySet() ) {
          APPLICATION_PROPERTIES.put( key, ( String )bundle.getObject( key ) );
        }
    }
}

不知道你真正想要什么。。。但如果您的服务不使用系统属性,而是依赖于不同的属性文件,则可能会有所帮助;也许这会有所帮助:?
同一JVM上每个java进程的属性
JVM是一个进程(不包括LWP)。没有像在一个JVM上有多个进程这样的事情是正确的,系统属性是每个JVM的-您正在应用程序级别查看某些东西您只能在命令行全局设置系统属性。您可以将它们设置为本地应用程序,但如何设置它们?不确定您真正想要的是什么。。。但如果您的服务不使用系统属性,而是依赖于不同的属性文件,则可能会有所帮助;也许这会有所帮助:?
同一JVM上每个java进程的属性
JVM是一个进程(不包括LWP)。没有像在一个JVM上有多个进程这样的事情是正确的,系统属性是每个JVM的-您正在应用程序级别查看某些东西您只能在命令行全局设置系统属性。你可以将它们设置为本地应用程序,但如何设置它们?我知道你的意思。在我的例子中,问题是第三个API希望设置并以这种方式处理
-Dkey1=valueX
,这很奇怪,而且当我在同一个tomcat进程中运行应用程序时,设计看起来很糟糕。我认为当我使用
javasomeclass
运行时,系统属性会有所不同。我想我已经测试过了。我知道你在说什么。在我的例子中,问题是第三个API希望设置并以这种方式处理
-Dkey1=valueX
,这很奇怪,而且当我在同一个tomcat进程中运行应用程序时,设计看起来很糟糕。我认为当我使用
javasomeclass
运行时,系统属性会有所不同。我相信我已经测试过了。