3

報奨金を出す前に、わかりやすくするためにこれを書き直します。

私がやりたいことは、(実行可能な) jar 形式で既に作成されているプログラムのブートストラップ ローダーを作成することです。このブートストラップ プログラムには、実行時に 3 つの単純な目標があります。

  1. ターゲット プログラムのローカル xml ファイルをサーバーでホストされているファイルと比較します (同じバージョンであることを確認するため)。

  2. それらが同じバージョンではなく、オンライン バージョンの方が新しい場合は、新しいバージョンをダウンロードします。

  3. この変更を反映するように xml ファイルを書き直します。

  4. 2 番目の jar ファイルを実行します (実行可能ファイルを起動したかのように起動します)。

私が抱えている問題は、ステップ番号 4 にあります。UrlClassLoader や他のライブラリを見ても、ブートストラップ プログラム内から jar を起動する確実な方法を見つけるのに苦労していることに気付きました。

いくつかの外部の問題により、JNLP / Web-start はこの場合のオプションではありません。

TL;DR: ブートストラップの実行時にプログラムを更新するために、jar 内から jar をダウンロード/起動する方法を見つける必要があります。

ありがとう!

4

4 に答える 4

0

Runtime.getRuntime().exec()

ただし、 MyApp.jar に出力がある場合は、いくつかの落とし穴があります。

exec を適切に使用する方法の詳細については、ドキュメントを確認してください...

http://docs.oracle.com/javase/6/docs/api/java/lang/Process.html

そして、いくつかの落とし穴についてのこのSO投稿を参照してください...

Java ランタイム.exec()

于 2012-11-12T21:29:22.547 に答える
0

「新しい jar を実行する」とは、スタンドアロン アプリケーションを起動することを意味しますか? 1 つの可能性として、Updater.jar ブートストラップ ロジックから新しい Java プロセスを単純に実行してから、それ自体を終了することが考えられます。

于 2012-11-12T21:30:16.413 に答える
0

私は自分の質問に答えなければならないのは嫌いですが、この場合、それを行う必要があると感じています...

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;

import org.w3c.dom.Document;


public class updater {
public static void main(String[] args) throws IOException {
    try{
        DefaultHttpClient httpclient = ClientMaker();
        HttpGet get = new HttpGet("http://encorpops04:8080/Updater-test/Version.xml");
        HttpResponse response = httpclient.execute(get);
        InputStream in = response.getEntity().getContent();

        DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = domFactory.newDocumentBuilder();
        Document doc = builder.parse(in);

        //Parse the Xml.
        XPathFactory factory = XPathFactory.newInstance();
        XPath xpath = factory.newXPath();
        XPathExpression expr = xpath.compile("//version/number/text()");
        String result = (String) expr.evaluate(doc, XPathConstants.STRING);
        System.out.println(result);

        File f = new File(System.getProperty("user.dir")+ "\\Version.xml");
        in = new FileInputStream(f) ;
        doc = builder.parse(in);
        expr=xpath.compile("//version/number/text()");
        String result2 = (String) expr.evaluate(doc, XPathConstants.STRING);
        System.out.println(result2);


        if(Double.parseDouble(result2) < Double.parseDouble(result)){
            HttpGet get2 = new HttpGet("http://encorpops04:8080/Updater-test/MyOutput.jar"); 
            HttpResponse response2 = httpclient.execute(get2);
            InputStream in2 = response2.getEntity().getContent();
            File f2 = new File("MyOutput.jar");
            OutputStream fos = new FileOutputStream(f2);
            byte buf[] = new byte[1024];
            int len;
            while ((len = in2.read(buf)) > 0) {
                fos.write(buf, 0, len);
            }
            fos.close();
            in.close();
        }
        System.out.println("cmd.exe /C  javaw -jar"  +System.getProperty("user.dir") + "\\MyOutput.jar");
        Process p = Runtime.getRuntime().exec("cmd.exe /C  javaw -jar "  +System.getProperty("user.dir") + "\\MyOutput.jar");
        p.waitFor();
        p.destroy();
    }catch(Exception e){ e.printStackTrace(); }


}

public static DefaultHttpClient ClientMaker() {
    int connectiontimeout = 30000; // 1 second int sockettimeout = 1000;
    HttpParams httpparameters = new BasicHttpParams();
    HttpConnectionParams.setConnectionTimeout(httpparameters,
            connectiontimeout);
    HttpConnectionParams.setSoTimeout(httpparameters, connectiontimeout);
    DefaultHttpClient httpclient = new DefaultHttpClient(httpparameters);
    return httpclient;
}

}

Version.xml は次のようになります。

<?xml version="1.0" encoding="ISO-8859-1"?>
<version>
    <number>1.0</number>
</version>

サイドノート- version.xml を自動的に更新しませんでした。一致するようにそこの番号を編集するか、チェックした番号をプルして置き換えることができます。

于 2012-11-17T17:20:41.703 に答える
0

つまり、自己更新可能なアプリケーションを実装したいと考えています。それは可能であり、それほど難しくありません。

プログラムは 2 つの部分を持つように設計する必要があります。ローダー (およびアップデーター) とビジネス ロジック。ローダーは、別のクラス ローダーを使用してビジネス ロジックを開始する必要があります。使用できますUrlClassLoader。ローダーはオンライン サービスに移動し、バージョンを確認します。必要な場合はURLConnection、新しいファイルを作成してダウンロードしjar、ファイルシステムのどこかに保存します (例: ユーザーのホーム ディレクトリ)。次に、ダウンロードしたばかりのjarファイルからクラスをロードする、前述のクラス・ローダーを使用してビジネス・ロジックを実行します。

これは実際に JNLP の動作を模倣しています。

于 2012-11-12T21:32:22.107 に答える