通过浏览器/ URL启动应用程序是否可行?这样做有哪些选择?
我知道用IE和Windows做这件事的方法(通常不起作用).理想情况下,我希望这与浏览器无关.
我们的应用程序是RCP,因此理论上Java Web Start可以工作,我们只需要对我们如何向用户提供应用程序进行一些重大更改,我想避免这些更改.如果有所不同,我们的Web服务器代码目前都是Java.
我几乎放弃了这个,直到我点击苹果网站上的网址,然后又推出了iTunes.
Apple如何做到这一点?
需要一些指导.
我有java webstart应用程序,我希望它通过SSL连接到服务器.只需添加一个属性,如:System.setProperty("javax.net.ssl.trustStore","my.keystore");但是因为JAWS程序是从服务器下载不起作用,本地文件系统上没有my.keystore.所以决定将证书分发给所有客户.我做了以下工作.
但我相信必须有比这更好的解决方案..任何想法让它变得更好?
public boolean validateUserFromActiveDirectory(String userId) {
final String MEMBER_GROUP = "CN=asdadasd,OU=asdasdasd Accounts,OU=adasdas,OU=asdasdas,DC=asdasdas,DC=asdasdas,DC=adasdasd,DC=asdasdasd";
String employeeNumber = "";
final String LDAP_INIT_CTX = "com.sun.jndi.ldap.LdapCtxFactory";
final String LDAP_URL = "ldap://xx-ssssssss.eee.eee.eeeee.eeeee:636";
final String MY_ATTRS[] = { "employeeNumber" };
String adminPassword = "somepassword";
String securityProtocol = "ssl";
boolean isValidUser = false;
try {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, LDAP_INIT_CTX);
env.put(Context.PROVIDER_URL, LDAP_URL);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.REFERRAL, "follow");
env.put(Context.SECURITY_PRINCIPAL, MEMBER_GROUP);
env.put(Context.SECURITY_CREDENTIALS, adminPassword);
env.put(Context.SECURITY_PROTOCOL, securityProtocol);
//C:\Documents and Settings\yourusername\Local Settings\Temp
File tf = File.createTempFile("someTruststore", …Run Code Online (Sandbox Code Playgroud) 我一直试图让webstart在内存不足时转储到堆转储.
我知道jmap/jconsole这样做的方式,但我真正想做的是将选项添加到jnlp文件并尝试了以下选项.
指定代码库是合法的:
<jnlp spec="6.0+"
codebase="file:/c:/MyApp/"
href="myapp.jnlp">
Run Code Online (Sandbox Code Playgroud)
使用JWS导入时,它会创建桌面快捷方式,并且应用程序正在运行.
但是,有一点与远程代码库有很大不同.当我在应用程序运行时更新这些文件时,它基本上会停止工作ClassNotFoundExceptions.似乎JWS没有复制jar,或者在更新时立即复制它们,以某种方式覆盖正在运行的进程使用的jar.
我如何让它像文件是远程的一样工作?也就是说,将文件复制到缓存并仅在启动时检查更新.
编辑:我还没有办法做到这一点,并决定采用自制的替代品.在此过程中,我发现了一些错误,并在http://squirrel.pl/blog/2011/11/24/java-web-start-bugs-offline-edition/上总结了一些观察结果.将它发布在这里,以防它可能对某人有用.
我们开始注意到,使用Java 7(特别是更新4),我们的所有用户都开始使用我们的Webstart应用程序看到这一点:
[14:42:58,422] AWT-EventQueue-0(DEBUG) java.lang.SecurityException: class "CLASSNAME" does not match trust level of other classes in the same package
[14:42:58,422] AWT-EventQueue-0(DEBUG) at com.sun.deploy.security.CPCallbackHandler$ChildElement.checkResource(Unknown Source)
[14:42:58,422] AWT-EventQueue-0(DEBUG) at com.sun.deploy.security.DeployURLClassPath$JarLoader.checkResource(Unknown Source)
[14:42:58,422] AWT-EventQueue-0(DEBUG) at com.sun.deploy.security.DeployURLClassPath$JarLoader.getResource(Unknown Source)
[14:42:58,422] AWT-EventQueue-0(DEBUG) at com.sun.deploy.security.DeployURLClassPath.getResource(Unknown Source)
[14:42:58,422] AWT-EventQueue-0(DEBUG) at java.net.URLClassLoader$1.run(Unknown Source)
[14:42:58,422] AWT-EventQueue-0(DEBUG) at java.net.URLClassLoader$1.run(Unknown Source)
[14:42:58,422] AWT-EventQueue-0(DEBUG) at java.security.AccessController.doPrivileged(Native Method)
[14:42:58,422] AWT-EventQueue-0(DEBUG) at java.net.URLClassLoader.findClass(Unknown Source)
[14:42:58,422] AWT-EventQueue-0(DEBUG) at com.sun.jnlp.JNLPClassLoader.findClass(Unknown Source)
[14:42:58,422] AWT-EventQueue-0(DEBUG) at java.lang.ClassLoader.loadClass(Unknown Source)
[14:42:58,422] AWT-EventQueue-0(DEBUG) at java.lang.ClassLoader.loadClass(Unknown Source)...More
Run Code Online (Sandbox Code Playgroud)
其中CLASSNAME =几乎每个类都在应用程序执行中的几个jar中的随机点,打破了几个行为.如果我们的用户使用Java 6,他们没有问题!只是7(更新4).我们签署所有的罐子,主要的应用罐子和它的库罐子.即启动我们的webstart应用程序的用户看到蓝色盾牌而不是黄色或红色.
这显然是一个问题,因为用户现在更频繁地升级到Java 7.我试图通过使用先前的安装(工作)或安装新的应用程序来强制我们的应用程序在用户计算机上使用Java 6 …
在我的公司,我们下载并启动了一个与JRE 1.6.0_20绑定的JNLP应用程序.我们使用系统缓存功能下载JAR.
当我们在PC上安装JRE 1.7时,WebStart无法启动.当我们启用日志时,我们会看到以下异常:
java.lang.ExceptionInInitializerError
at com.sun.deploy.net.protocol.https.Handler.openConnection(Unknown Source)
at java.net.URL.openConnection(Unknown Source)
at com.sun.deploy.net.BasicHttpRequest.createUrlConnection(Unknown Source)
at com.sun.deploy.net.BasicHttpRequest.doRequest(Unknown Source)
at com.sun.deploy.net.BasicHttpRequest.doGetRequestEX(Unknown Source)
at com.sun.deploy.net.DownloadEngine.actionDownload(Unknown Source)
at com.sun.deploy.net.DownloadEngine.getCacheEntry(Unknown Source)
at com.sun.deploy.net.DownloadEngine.getCacheEntry(Unknown Source)
at com.sun.deploy.net.DownloadEngine.getResourceCacheEntry(Unknown Source)
at com.sun.deploy.net.DownloadEngine.getCachedFile(Unknown Source)
at com.sun.javaws.jnl.LaunchDescFactory.buildDescriptor(Unknown Source)
at com.sun.javaws.jnl.LaunchDescFactory.buildDescriptor(Unknown Source)
at com.sun.javaws.Main.launchApp(Unknown Source)
at com.sun.javaws.Main.continueInSecureThread(Unknown Source)
at com.sun.javaws.Main$1.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassCastException: sun.security.ssl.X509TrustManagerImpl cannot be ast to com.sun.net.ssl.internal.ssl.X509ExtendedTrustManager
at com.sun.deploy.security.X509ExtendedDeployTrustManager.<init>(Unknown Source)
at com.sun.deploy.net.protocol.https.Handler$Initializer$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.deploy.net.protocol.https.Handler$Initializer.<clinit>(Unknown Source)
... 16 more
Run Code Online (Sandbox Code Playgroud)
有一个已知的解决方法吗?
只是尝试在整个swinglabs演示中添加一些swingx-ws组件 - 并注意到与本地加载相比,简单的JXMapKit/-Viewer在webstartable中加载tile的速度要慢几个数量级.
相当失去我应该开始寻找的地方(ui更新似乎在EDT上,但可能需要仔细看看):
代码非常简单(要在本地运行,你需要swingx和swingx-ws:
public class WSDemo {
private JComponent createContent() {
JComponent content = new JPanel();
content.setLayout(new BorderLayout());
content.add(createMapKit());
return content;
}
protected JComponent createMapKit() {
final int max = 17;
TileFactoryInfo info = new TileFactoryInfo(1, max - 2, max, 256, true,
true, // tile size is 256 and x/y orientation is normal
"http://tile.openstreetmap.org",// 5/15/10.png",
"x", "y", "z") {
public String getTileUrl(int x, int y, int zoom) {
zoom = max …Run Code Online (Sandbox Code Playgroud) 一旦Java Swing应用程序从Java 6 32位转移到Java 7 32位更新11,我们就会遇到性能问题.任何人都可以提供一些线索吗?
该应用程序使用Java Web-start技术,服务器是Tomcat 7.客户端应用程序占用1GB内存,因此屏幕冻结.
我们正在交换序列化对象,以下是代码:
Object object = connection.sendCommand(command); // exchanging serialized object
public class ConnectionImpl implements Connection {
public Object sendCommand(Command command) throws Exception {
URL url = new URL(System.getProperty("serverUrl"));
URLConnection connection = url.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
oos = new ObjectOutputStream(new BufferedOutputStream(connection
.getOutputStream()));
oos.writeObject(command);
oos.flush();
InputStream inputStream = connection.getInputStream();
ZipInputStream zip = new ZipInputStream(inputStream);
if (zip.getNextEntry() != null) {
ois = new ObjectInputStream(zip);
object = ois.readObject();
}
zip.close();
}
}
// The serialized class …Run Code Online (Sandbox Code Playgroud) 我们有一个多项目gradle设置,每个子项目有一个Java jar:
- root-project
|-sub-project-a
|-sub-project-b
|-sub-project-c
Run Code Online (Sandbox Code Playgroud)
现在,因为我们正在创建Java webstart应用程序,所以我们需要签署所有项目jar以及所有第三方库(依赖项).
我现在的方法是将所有已构建的子项目jar和所有第三方库复制到一个单独的文件夹中,并执行签名任务.但是我无法复制罐子.
这是我在root build.gradle中的方法:
task copyFiles(type: Copy, dependsOn: subprojects.jar) {
from configurations.runtime
from("build/libs")
into("webstart/lib")
include('*.jar')
}
Run Code Online (Sandbox Code Playgroud)
和...一起:
task signAll(dependsOn: [copyFiles]) << {
new File('webstart/signed').mkdirs()
def libFiles = files { file('webstart/lib').listFiles() }
...
}
Run Code Online (Sandbox Code Playgroud)
然后我尝试执行gradle signAll.但是,我只能在webstart/lib文件夹中找到一个带有根项目名称的空jar.
也许我的方法是完全错误的.如何将所有创建的和第三方派对复制到一个文件夹中?
看起来Oracle已经发生了类似于Java 7u45的更改,其中需要设置新的清单值来运行签名的Java Webstart应用程序(请参阅此处).
目前,我们使用Java 8u131签名的应用程序不能从带有错误消息的Java8u141开始 Could not verify signing in resource: (arbitrary resource.jar)
您是否仍然可以使用Java 8u141运行已签名的Webstart应用程序,即我是否有特殊问题?
在发行说明中是对安全性更改的说明,但它们与代码签名无关.此外密码路线图是这样的释放并没有真正改变代码签名,尽管Java的8u131例如,在辗转MD5支持.但是Java 8u131对我有用,Maven Java Webstart插件也使用SHA-256-Digest.
java ×10
java-web-start ×10
java-7 ×2
jnlp ×2
swing ×2
code-signing ×1
deployment ×1
gradle ×1
jar ×1
javascript ×1
jxmapkit ×1
memory ×1
security ×1
ssl ×1
truststore ×1
url ×1