1

我有一个 JNLP,我在其中为主应用程序提供了一些参数。

我想以可移植(至少 Windows/Linux)的方式提供用户主目录的子目录作为参数。

我试图查看 ${user.home},但我真的不知道 JNLP 是否会执行替换。

编辑

说清楚:我不需要在客户端机器上存储或查找某些属性的方法。我需要一种通过包含用户主目录的 JNLP 传递参数的方法。这显然至少应该在 Windows 和 Linux 平台上工作。为了实现这个目标,我只想读取 JVM 设置的系统属性“user.home”。但是,我认为 Java Web Start 可以在客户端上执行一些替换。

确实,所需的参数可能与用户的主目录相关,而我的应用程序可以只加载系统属性。但是,当我不想要这种行为时,有一些用例。

我只是想用一种独立于平台的方式来指定用户的主目录……</p>

4

3 回答 3

1

在 jnlp 文件中由 Web 服务器自动替换的唯一值是:

  • $$codebase - 请求的 URL,JNLP 文件的名称除外
  • $$name JNLP 文件的名称
  • $$context Web 应用程序的基本 URL
  • $$site Web 服务器地址
  • $$hostname 服务器的名称

只有在 servlet 容器中使用 JNLPDownloadServlet 时才会发生这些替换。

主机在下载 JNLP 文件时不可能知道用户 home 参数的值。

如果您正在部署可以作为独立运行的 JNLP,并且您需要将参数加载到应用程序,我建议在特定位置使用属性文件,并在文件不存在时使用默认值(应用程序可以动态创建属性文件第一次运行时,或者您可以使用安装程序来执行此操作)。

下面是一个详细的例子:

public class Main {
    public static void main(String ... args) throws IOException{
         new Main();
    }

    private static Properties instance;

    public static Properties getProperties(){
        return instance;
    }

    private static Properties defaultProperties(){
        // implement default properties here
        Properties props = new Properties();
        props.setProperty("myApp.property1","someDefaultValue");
        return props;
    }

    public static void createDefaultPropsFile(File propsFile,Properties props) throws IOException {
        propsFile.getParentFile().mkdirs();            
        props.store(new FileWriter(propsFile),"My App Properties");
    }


    private Main() throws IOException{
         File appDir = new File(System.getProperty("user.home"), "myApp");
         // find property file
         File propsFile = new File(appDir, "settings.properties");
         Properties appProperties = new Properties(defaultProperties());
         if(!propsFile.exists()){
             createDefaultPropsFile(propsFile,appProperties);
         } else {
             appProperties.load(new FileReader(propsFile));
         }
         // this should really be done using a singleton or something similar
         instance = appProperties; 
         System.out.println("Property"+getProperties().getProperty("myApp.property1"));        
    }
}
于 2013-02-27T16:28:16.380 回答
0

感谢您的回答,但我无法将属性存储在用户目录中。我只希望参数列表是可移植的,以便始终找到用户主目录。

我的解决方案并不完美,它只是遵循 Apache 的 Ant 方式:将出现的 ${myvariable} 替换为系统属性中的相应值。

这是代码:

public class PropertySubstitutor {
    private static final Pattern VARIABLE_PATTERN = Pattern.compile("\\$\\{(.*?)\\}");

    public static String substitute(String source) {
        Matcher matcher = VARIABLE_PATTERN.matcher(source);
        Properties properties = System.getProperties();
        StringBuffer buffer = new StringBuffer(source.length());
        while (matcher.find()) {
            matcher.appendReplacement(buffer, properties.getProperty(matcher.group(1), ""));
        }
        matcher.appendTail(buffer);
        System.out.println(buffer.toString());
        return buffer.toString();
    }

    private PropertySubstitutor() {}
}

可以更改此帮助程序以使用用户定义的属性对象。

我使用缓慢的正则表达式引擎,因为我只需要在应用程序启动时解析两个或参数。

于 2013-02-28T13:02:09.967 回答
0

如果您重定向桌面 - java 7 及以下版本似乎错误地设置了 user.home。例如,不符合 %userprofile% 。

于 2016-04-27T17:01:44.240 回答