从网络浏览器运行应用程序

从网络浏览器运行应用程序

问题描述:

我想从网站运行应用程序,例如Windows计算器。我考虑使用浏览器插件,Java Web Start,像代理程序或其他可以在Windows/Linux上运行的解决方案,而无需太多工作。从网络浏览器运行应用程序

插件的方式: 我看到它可以完成与NPAPI但它似乎已经死了。我也看着FileSystemAPI但它似乎也已经死了。有没有好的API来做到这一点?

代理方式: 我想到了Java代理,用户将安装并通过它与系统进行通信。

+0

检出Javascript http://*.com/questions/2716284/how-can-i-run-a-local-windows-application-and-have-the-output-它可能可以做这样的事情 – TheBat 2014-08-29 18:22:49

+0

您是否正在谈论运行的程序,用户可能已经安装在他们的计算机上或正在运行可能从您的网页托管的应用程序? – 2014-08-29 18:23:32

+0

您的意思是运行您自己的网络应用程序或小应用程序,或者您是否正在谈论如何在浏览器中单击按钮时在用户的硬盘上运行Windows计算器? – markspace 2014-08-29 18:25:25

我已经成功地做到这一点的Java Web Start的:

1)我创建Swing应用程序,源代码如下所示。基于http://java.dzone.com/articles/java-web-start-jnlp-hello教程。下面

代码:

package com.gogowitczak; 

import javax.jnlp.*; 
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.io.*; 

public class Main { 
    static BasicService basicService = null; 

    public static void main(String args[]) { 
     JFrame frame = new JFrame("Mkyong Jnlp UnOfficial Guide"); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JLabel label = new JLabel(); 
     Container content = frame.getContentPane(); 
     content.add(label, BorderLayout.CENTER); 
     String message = "Jnln Hello Word"; 

     label.setText(message); 

     try { 
      basicService = (BasicService) 
        ServiceManager.lookup("javax.jnlp.BasicService"); 
     } catch (UnavailableServiceException e) { 
      System.err.println("Lookup failed: " + e); 
     } 

     JButton button = new JButton("http://www.mkyong.com"); 

     ActionListener listener = new ActionListener() { 
      public void actionPerformed(ActionEvent actionEvent) { 
       try { 
        Runtime.getRuntime().exec("C:\\Windows\\System32\\calc.exe"); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }; 

     button.addActionListener(listener); 

     content.add(button, BorderLayout.SOUTH); 
     frame.pack(); 
     frame.show(); 
    } 
} 

2)除了这一点,我创建MANIFEST.MF文件。

文件是src\META-INF\MANIFEST.MF路径:

Manifest-Version: 1.0 
Main-Class: com.gogowitczak.Main 
Permissions: all-permissions 

3),当然,.jnlp文件,对Java Web Start的。

文件是src\JNLP-INF\APPLICATION.JNLP路径:

<?xml version="1.0" encoding="utf-8"?> 
<jnlp spec="1.0+" codebase="http://localhost:8080/" href="Test.jnlp"> 
    <information> 
     <title>Jnlp Test</title> 
     <vendor>MyVendor</vendor> 
     <homepage href="http://localhost:8080/" /> 
     <description>Testing Testing</description> 
    </information> 
    <security> 
     <all-permissions/> 
    </security> 
    <resources> 
     <!-- <j2se version="1.7+" /> --> 
     <j2se version="1.7*" java-vm-args="-Xmx32m" max-heap-size="32m" href="http://java.sun.com/products/autodl/j2se"/> 
     <jar href="jws.jar" /> 
    </resources> 
    <application-desc main-class="com.gogowitczak.Main" /> 
</jnlp> 

4)应当能够编译和运行这个项目直接从IDE你正在使用(的IntelliJ是我)。点击按钮应打开新的Windows计算器窗口。

5)从该项目创建.jar。在IntelliJ中很容易:文件 - >项目结构 - >工件 - >'+' - > jar - >从具有依赖关系的模块。选择com.gogowitczak.MainMain Class。确保已选中复选框Build on make

6)再次建立项目。在<project_path>\out\artifacts\<project_name>_jar中,您应该找到<project_name>.jar文件。对我来说它是jws.jar

7)现在您需要创建自己的证书。它需要签署.jar文件。 您可以通过运行keytool -genkey -keystore testKeys -alias jdc来完成。可以在JDK安装目录下找到keytool.exe,在bin文件夹中。对我来说,这是路径C:\Program Files\Java\jdk1.8.0_05\bin\keytool.exe。记住你设置的密码,其他的东西现在是不相关的。此方法基于Oracle website

8)通过执行jarsigner jsw.jar jdc签署您的.jar。很可能它会抱怨在主目录中缺少.keystore文件。搬出testKeys文件存在,并更改了它的名字.keystore(如果Windows将resufe在开始时设定点的文件名,你总是可以重命名它执行move testKeys .keystore

9)现在,你必须把它放在网页服务器。最简单的方法就是设置Tomcat。从here下载它,将我们签署的.jar文件连同APPLICATION.JNLP的副本一起放入<tomcat_directory>\webapps\ROOT\目录中。重命名为APPLICATION.JNLPTest.jnlp

10)现在您可以试试看。转到gttp:// localhost:8080/Test.jnlp,看看会发生什么。每当浏览器战胜危险时,请继续同意执行它。如果失败,最可能是拒绝自签名证书。打开“配置Java”菜单并将http://localhost:8080条目添加到“异常站点列表”中。

Configure Java window

11)现在再次进入网页浏览器并刷新页面。这次执行Java应用程序应该结束,点击一个按钮后,它应该打开Windows计算器。

如果我做错了什么或者如果您有任何问题,请不要犹豫,写评论。希望它能帮助某人。并记住关于投票;)

可能是你想使用Applet

您可以将一个applet附加到一个网页上,它会被下载到客户端site.y您将能够执行预制操作。

+0

小程序正在消失;一旦Java 1.9出现,他们将不能运行 – 2016-06-08 20:26:33

+0

@SheldonR。我同意。所以这是downvote的原因? – 2016-06-22 05:13:10

+0

是的,是的。我现在不得不自己处理小程序替换,这就是为什么我按照我所做的方式说和投票的原因...... – 2016-06-24 20:34:27