JavaのプログラムをWindowsのサービスとして起動したいと思っています。
ネットを調べてみると「Java Service Wrapper」などいくつか方法があるみたいですが、どうにもうまくいきません。
端的に、普段
"javaw -jar test.jar"
で起動するコンパイル済みJAVAプログラムをサービス化するにはどうすればよいのでしょうか?
お分かりになる方いらっしゃいましたらお願いします。

環境
OS: Windows 7 Professional 64bit
CPU: AMD Phenom II
Java: jdk1.6.0_23 (32bit)

※test.jarは改変せずにサービス化したいです
※ネットではタスクスケジューラと-Xrsオプションを使ってパソコン起動時にJavaを起動する方法も見受けられましたが、
タスクスケジューラは別件でエラーがでるので上手くいきません

このQ&Aに関連する最新のQ&A

A 回答 (1件)

fumi0067さん、



下のページで説明を読んで下さい。↓↓↓
http://wrapper.tanukisoftware.com/doc/japanese/i …


結論に達して、Wrapperのconfファイルでこの変更をして下さい:

wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperJarApp

wrapper.java.classpath.1=..\lib\wrapper.jar
wrapper.java.classpath.2=test.jar

wrapper.app.parameter.1=test.jar

「Wrapper実行ファイルの配置場所へのファイル参照は、絶対参照あるいは相対参照でなければなりませんので、注意してください。」

後は、Wrapperがネイティブライブラリを利用しておりますので-Xrsは要りません。

以上、よろしくお願いします。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
これまではbin以下ではなくbinと同じ階層にtest.jarを置いていたこともこれまでうまくいかなかった原因かもしれません(原因の切り分けまではしておりません)が、
とにかくアドバイスに従って設定を行ったところうまくいきました。

お礼日時:2011/04/27 02:36

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q再度、スレッドが実行中かどうかの確認

一度質問したことですが、再度質問させていただきます。
過去の質問は以下です。
http://oshiete1.goo.ne.jp/qa5528714.html

過去の質問を参考に、以下のように実装しました。
public class TEST{
 public boolean testMe(){
  Runnable runnable = /* 省略 */;
  Thread thread = new Thread(runnable);

  boolean alive = thread.isAlive();

  /* 必ずfalseになってしまう */
  if(!alive){
   thread.start();
   return true;
  }
  return false;
 }
}

public class TEST2 implements Runnable{
 public void run(){
  /* 処理 */
 }
}

上記の通りだと「thread.isAlive()」が必ずfalseで返ってきます。
また、Executorを利用した実装も試しました。

/* 処理を省略 */

ExecutorService executorService = Executors.newSingleThreadExecutor();

Runnable runnable = /* 省略 */;

// シャットダウン結果
boolean exeShutdown = executorService.isShutdown();

/* 一度シャットダウンすると、ずっとtrueになってしまう */
if(!exeShutdown){
 // 実行
 executorService.execute(runnable);
 // シャットダウン
 executorService.shutdown();
}

一度は実行されるのですが、
その後は「executorService.isShutdown()」がtrueしか返しません。
なので、一度しか実行できません。
再度、知恵を貸していただければと思います。
よろしくお願い致します

一度質問したことですが、再度質問させていただきます。
過去の質問は以下です。
http://oshiete1.goo.ne.jp/qa5528714.html

過去の質問を参考に、以下のように実装しました。
public class TEST{
 public boolean testMe(){
  Runnable runnable = /* 省略 */;
  Thread thread = new Thread(runnable);

  boolean alive = thread.isAlive();

  /* 必ずfalseになってしまう */
  if(!alive){
   thread.start();
   return true;
  }
  return false;
 }
}

publi...続きを読む

Aベストアンサー

元の質問には「「一度ボタンを押してスレッドが実行中の場合は処理を実行しない」という処理を実装したい」と書かれていますが、これは
(a) 実行中のスレッドが終了するまでは、何度ボタンを押しても単に無視する
(b) スレッド実行中にボタンが押された場合は、新しいスレッドを作るが今実行中のスレッドが終了するまで処理開始を遅らせる
のどちらでしょうか?

(a)だったら、最後に作ったスレッドを覚えておく変数を用意すればいいだけ。
public class TEST {
private static Thread lastThread = null;
public boolean testMe() {
if (lastThread != null && lastThread.isAlive()) {
return false;
} else {
Thread newThread = new Thread(...);
newThread.start();
lastThread = newThread;
return true;
}
}

(b)だったら、一番手抜きな方法はrun()メソッドの中身を全て排他処理にしてしまうこと。これなら、run()の内容を2つ以上のスレッドが同時に実行することができません。
public class TEST2 implements Runnable {
private static Object lock = new Object();
public void run() {
synchronized (lock) {
/* 処理 */
}
}
}

元の質問には「「一度ボタンを押してスレッドが実行中の場合は処理を実行しない」という処理を実装したい」と書かれていますが、これは
(a) 実行中のスレッドが終了するまでは、何度ボタンを押しても単に無視する
(b) スレッド実行中にボタンが押された場合は、新しいスレッドを作るが今実行中のスレッドが終了するまで処理開始を遅らせる
のどちらでしょうか?

(a)だったら、最後に作ったスレッドを覚えておく変数を用意すればいいだけ。
public class TEST {
private static Thread lastThread = null;
...続きを読む

QJavaで常駐するソフトを作っています

Javaを利用して常駐するタスクスケジューラのようなプログラムを作成しています。
大体は完成したのですが、どうしてもわからない部分があります。

「起動したらX分毎にバッチファイル起動!」

はできるのですが、

「起動したら60分毎にバッチファイル起動!」
※ただしバッチファイル起動時間は 01:05、02:05、03:05 など指定間隔ごとにする

プラス、

「起動したら毎日23:55にバッチファイル起動!」

が思いつきません。

====================================

import java.awt.AWTException;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.TrayIcon.MessageType;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.util.Timer;
import java.util.TimerTask;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class Task {

/**
* メール振分タスク
*/


public static void main(String[] args) throws Exception {

try {

// 多重起動チェック
@SuppressWarnings("resource")
FileChannel fc = new FileOutputStream(new File("LockFile")).getChannel();
FileLock lock = fc.tryLock();
if (lock == null) {

//既に起動されているので終了する
JFrame frame = new JFrame();
JOptionPane.showMessageDialog(frame, "すでに起動されています!");
return;

}

//起動メッセージ表示
JFrame frame = new JFrame();
JOptionPane.showMessageDialog(frame, "タスクを起動しました!");
new Task();

} catch (Exception e) {

}

}

/** コンストラクタ */
public Task() throws IOException, AWTException {

// アイコンイメージの読み込み
Image image = ImageIO.read(Thread.currentThread().getContextClassLoader().getResourceAsStream("16_16.png"));

// トレイアイコン生成
final TrayIcon icon = new TrayIcon(image);

// イベント登録
icon.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
icon.displayMessage("メール配信","メール配信システム アイコンがダブルクリックされました",MessageType.WARNING);
}

});

// ポップアップメニュー
PopupMenu menu = new PopupMenu();

// 終了メニュー
MenuItem exitItem = new MenuItem("終了");
exitItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});

// メニューにメニューアイテムを追加
menu.add(exitItem);
icon.setPopupMenu(menu);

// タスクトレイに格納
SystemTray.getSystemTray().add(icon);

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// 01_メール受信起動.bat
TimerTask task0 = new TimerTask() {
@Override
public void run() {

icon.displayMessage("タイマー2分","メールチェックします\n" , MessageType.INFO);

// メールチェック起動
String cmd = "cmd.exe /c start c:/dummy.bat";
try {
Runtime.getRuntime().exec(cmd);
} catch (IOException e) {
e.printStackTrace();
}

}
};

Timer timer = new Timer();
timer.scheduleAtFixedRate(task0, 0, 2 * 60 * 1000); // 2分ごと


}

}

Javaを利用して常駐するタスクスケジューラのようなプログラムを作成しています。
大体は完成したのですが、どうしてもわからない部分があります。

「起動したらX分毎にバッチファイル起動!」

はできるのですが、

「起動したら60分毎にバッチファイル起動!」
※ただしバッチファイル起動時間は 01:05、02:05、03:05 など指定間隔ごとにする

プラス、

「起動したら毎日23:55にバッチファイル起動!」

が思いつきません。

===================================...続きを読む

Aベストアンサー

Timerクラスを使う。

参考URL:http://www.atmarkit.co.jp/fjava/javatips/078java008.html

Qinterface,extend,implementのちがい

お世話になります、

Javaを勉強しているのですが、
interface,extend,implementの使い分けがわかりません。

私の解釈としては、
(1)interfaceは、グローバル変数の定義、グローバルメソッドの定義(実装はしない)。

(2)extendは、extendクラスを親クラスとして親クラスの機能を使用できる。

(3)implementは…,implementもextendと同じような意味だと解釈しているんですが、違う点は、implementで定義してあるメソッドは、使用しなくても、実装しなければならないという点でしょうか?

とにかくこの3つのを使い分けるコツとかあれば教えてください。
よろしくお願いします。

Aベストアンサー

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば、getStringLength()メソッドなどが
あったほうが良いでしょうか。
このgetStringLength()メソッドは、2バイト文字も1バイト文字も「1文字」
と数えてくれると言う点で、まさに、日本語クラス用のメソッドだと言えるでしょう。

例えば、Java的に記述すると、、、
class Japanese {
public int getStringLength() {
  ・・・
return strlength;
 }
 ・・・
}

class TextField {
・・・
}

class JTextField extends TextField, extends Japanese {
・・・・
}

C++ではそのように実装するでしょう。
しかし、Javaにはこのような高度な機能はありません。

そこで、生まれた苦肉の策が、「interfaceとimplements」です。

interface Japanese {
public int getStringLength(); // interfaceは実装を含まない!
                 // すなわち「実装の継承」ができるわけではない。
}

class TextField {
・・・
}

class JTextField extends TextField implements Japanese {
・・・・
public int getStringLength() {
  ・・・
return strlength; //implementsの実装を「各クラスで」実装してやる必要がある。
 }
}


結局のところ、Javaでは、複数のクラスを親クラスには持ち得ないため、継承できなかったクラスは「各クラスで実装してやる必要性」があるのです。


ではどのように使うのが効果的か?

なまえのままです。「代表的なインターフェイス」にたいしてinterfaceを使うのが良いと思います。

例えば、プレイヤー系であれば、ビデオ・コンポ・ウォークマン・などにかかわらず、
interface controlpanel {
public play();
public stop();
public next();
public back();
}
というような基本的インターフェイスを「持っているべき」です。

こうすることで、それぞれのクラス宣言の際に、これらの「インターフェイスを持っているべきであり、実装されるべきである」ということを「強く暗示」することができます。
class videoplayer extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

こうすることで、同様のクラスを作成するユーザーは、
「プレイヤー系は、4つ操作が出来るコントロールパネルをインターフェイスとして持つべきなのだな!?」という暗示を受け取り、自分のクラスでもそれを模倣するでしょう。

class mp3player extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

また、これらのクラスを使用するユーザーも、「implements controlpanel」という
表記を見て、「4つの基本操作は押さえられているのだな!」という基本中の基本動作を抑えることが出来ます。

まとめると、クラスに「こういう特徴もたしてください!」「こういう特徴持ってますよ!」という一種の暗示的警告や方向性を与えることができるわけですね。

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば...続きを読む

Q文字列から数字を取り出す方法

質問があります。
例えば、テキストファイルから文章を一行ずつ読み込み、それをString型の変数に格納していきます。
その文から数字(整数で、何桁かはわからない。)を取り出し(ちなみにその数字の前後には特定の文字がついています)、変数に格納するというプログラムを作りたいのですが、具体的な方法がわかりません。
よろしければ是非教えてください!

Aベストアンサー

こんな感じですか?
数値以外を除きそのまま代入させます

String str = "ABCDABCD1234512345abcd";
int ret = Integer.parseInt(str.replaceAll("[^0-9]",""));
System.out.println(ret); //結果表示

Qbatファイルの結果をテキストに吐き出すには?

以下のようなWindowsユーザーのパスワード変更batの結果(正常に出来たかどうか?)をCドライブに吐き出したいのですが、どうbatファイルを書き換えればよいでしょうか?
(とりあえず以下の内容でbatをたたいたのですが、うまく結果が出ません。。。)

henkou.bat
--------------------------------------
net user "test user1" ps123456 /domain
net user "test user2" ps456789 /domain
henkou.bat > c:\henkou結果.txt
pause
--------------------------------------

吐き出されたhenkou結果.txt
--------------------------------------
C:\>net user "test user1" ps123456 /domain
--------------------------------------

DOS画面(吐き出したいもの)
--------------------------------------
C:\>net user "test user1" ps123456 /domain
コマンドは正常に終了しました。

C:\>net user "test user2" ps456789 /domain
コマンドは正常に終了しました。

C:\>henkou.bat 1>c:\henkou結果.txt
--------------------------------------

以下のようなWindowsユーザーのパスワード変更batの結果(正常に出来たかどうか?)をCドライブに吐き出したいのですが、どうbatファイルを書き換えればよいでしょうか?
(とりあえず以下の内容でbatをたたいたのですが、うまく結果が出ません。。。)

henkou.bat
--------------------------------------
net user "test user1" ps123456 /domain
net user "test user2" ps456789 /domain
henkou.bat > c:\henkou結果.txt
pause
--------------------------------------

吐き出されたhenkou結果.t...続きを読む

Aベストアンサー

henkou.bat
--------------------------------------
@ECHO OFF

IF NOT EXIST %temp%\Redirect.txt GOTO REDIREXEC

@ECHO ON

net user "test user1" ps123456 /domain
net user "test user2" ps456789 /domain

@ECHO OFF

GOTO END

:REDIREXEC

ECHO REDIRECT > %temp%\Redirect.txt

CALL TEST.BAT > c:\henkou結果.txt

DEL %temp%\Redirect.txt

PAUSE

:END
--------------------------------------

こんな感じでどうでしょうか。

QOracle12cでユーザのSQLPLUSログイン

基本的な質問ですみません。Oracle 12cを初めて使うのですが、すごく単純に、ユーザを作成し、そのユーザでデータベースオブジェクト(テーブルなど)を作成する拡張子が.sqlのスクリプトを流したいです。

11gまでの場合、システムユーザでCREATE USERしたのちに、コマンドプロンプトを立ち上げて
C:\Scripts> SQLPLUS <USER>/<PASSWORD> @createtables.sql
とするだけで良かったと思います。

今回、12cではユーザの考え方が変わっており、CDBとPDBを作成しました。
> SQLPLUS /NOLOG
SQL> CONN SYS AS SYSDBA
(上記のようにローカル接続するとCDBに接続される)

SQL> ALTER SESSION SET CONTAINER=PDB1; // PDBへ移動
SQL> SHOW CON_NAME // 念のため現在接続中のPDBの名前確認
SQL> STARTUP;
(これでマウント状態だったPDB1がOPENしてREAD WRITEになる)

この状態でCREATE USER文を実行してPDB1上でユーザを作成。

ここからなんですが、PDBやCDBへのログイン方法はわかたのですが、PDB上で作成したユーザにはどのようにしてログインするのでしょうか? ログインしてテーブル作成をしたいです。また、テーブル作成のスクリプト文(.sql)があるのでそれを流したい場合は、コマンドプロンプトからどのように実行すればよいでしょうか?

基本的な質問で恐縮ですが、宜しくお願いします。

基本的な質問ですみません。Oracle 12cを初めて使うのですが、すごく単純に、ユーザを作成し、そのユーザでデータベースオブジェクト(テーブルなど)を作成する拡張子が.sqlのスクリプトを流したいです。

11gまでの場合、システムユーザでCREATE USERしたのちに、コマンドプロンプトを立ち上げて
C:\Scripts> SQLPLUS <USER>/<PASSWORD> @createtables.sql
とするだけで良かったと思います。

今回、12cではユーザの考え方が変わっており、CDBとPDBを作成しました。
> SQLPLUS /NOLOG
SQL> CONN SYS AS SYSDBA
...続きを読む

Aベストアンサー

こんにちわ。

> ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。
上のtnsnames.ora の設定は、CDB に接続するためのものです。
新しい接続文字列で、SERVICE_NAME にPDB名を指定したものを作成して
試してみて下さい。


人気Q&Aランキング

おすすめ情報