让jar包可以双击运行,其实很简单
1.写一个manifest.mf文件,里面只有两行
第一行为Main-Class
第二行为空行
注意冒号后面有一个空格
Main-Class: YourClassName
2.用jar命令打包
jar -cvfm xxx.jar xxx.mf classfiles
3.然后就可以运行了
要注意,双击运行jar包时,
系统会调用javaw而不是java,
因此命令行输出是看不到的。
Learn and share.
让jar包可以双击运行,其实很简单
1.写一个manifest.mf文件,里面只有两行
第一行为Main-Class
第二行为空行
注意冒号后面有一个空格
Main-Class: YourClassName
2.用jar命令打包
jar -cvfm xxx.jar xxx.mf classfiles
3.然后就可以运行了
要注意,双击运行jar包时,
系统会调用javaw而不是java,
因此命令行输出是看不到的。
| boolean | Z |
| byte | B |
| char | C |
| double | D |
| float | F |
| int | I |
| long | J |
| short | S |
| class/interface | Lclassname |
| array | [ |
1.Java代码CallApi.java
class CallApi{
private native String showMessageBox(String msg);
private native double getRandomDouble();
static{
try{
System.loadLibrary("CallApi");
System.out.println("Loaded CallApi");
}catch(UnsatisfiedLinkError e){
//nothing to do
System.out.println("Couldn't load CallApi");
System.out.println(e.getMessage());
}
}
public static void main(String args[]){
CallApi api = new CallApi();
double randomNumber = api.getRandomDouble();
String retval = api.showMessageBox("Hello from Java!\n"+
"The native random number: "+randomNumber);
System.out.println("The native string: "+retval);
}
}
2.生成dll的CallApi.h文件
javah -classpath . -jni CallApi
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class CallApi */
#ifndef _Included_CallApi
#define _Included_CallApi
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: CallApi
* Method: showMessageBox
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_CallApi_showMessageBox
(JNIEnv *, jobject, jstring);
/*
* Class: CallApi
* Method: getRandomDouble
* Signature: ()D
*/
JNIEXPORT jdouble JNICALL Java_CallApi_getRandomDouble
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
3.手写dll的CallApi.c文件
#include"CallApi.h"
#include <windows.h>
#include <time.h>
//#pragma comment(lib,"user32.lib")
JNIEXPORT jstring JNICALL Java_CallApi_showMessageBox
(JNIEnv *env, jobject thisObject, jstring js)
{
//first convert jstring to const char for use in MessageBox
const jbyte* argvv = (*env)->GetStringUTFChars(env, js, NULL);
char* argv =(char *) argvv;
//Call MessageBoxA
MessageBox(NULL, argv, "Called from Java!", MB_ICONEXCLAMATION | MB_OK);
return js;
}
JNIEXPORT jdouble JNICALL Java_CallApi_getRandomDouble
(JNIEnv *env, jobject thisObject)
{
double num1;
srand((unsigned)(time(0)));
num1 = ((double)rand()/(double)RAND_MAX);
return num1;
}
4.编译
注意1:要引用jdk下的include目录下文件,因此要增加引用文件路径
注意2:用MT而不是MD
5.运行
java -Djava.library.path=. CallApi
::Hansen
::2012-02-22
::Set ClassPath
@echo off
for %%i in ("lib/*.jar") do call :appendPath %%i
goto pathOK
:appendPath
set CLASSPATH=%CLASSPATH%;lib/%1
goto :eof
:pathOk
@echo on
1、生成keystore及key
#生成私钥 keytool -validity 10000 -genkey -alias xxxxxx -keypass xxxxxx -storepass xxxxxx -keystore xxxxxx.jks -dname "CN=(R&D),O=(ATS),C=(CN)" -keyalg RSA
导出证书
#证书DER格式 keytool -exportcert -alias xxxxxx -keypass xxxxxx -keystore xxxxxx.jks -storepass xxxxxx -file xxxxxx.der #证书PEM格式 keytool -exportcert -alias xxxxxx -keypass xxxxxx -keystore xxxxxx.jks -storepass xxxxxx -rfc -file xxxxxx.pem
枚举证书
keytool -list -keystore xxxxxx.jks
2、签名
jarsigner -keystore xxxxxx.jks -storepass xxxxxx -keypass xxxxxx xxxxxx.jar xxxxxx
3、验证
JARsigner -verbose -verify xxxxxx.jar
运行下面代码,得到的结果是什么?
obj还是objs?
public class Test{
public static void test(Object obj){
System.out.println("obj");
}
public static void test(Object[] objs){
System.out.println("objs");
}
public static void main(String[] args){
test(null);
}
}
是objs哦:)
下面语句会出错吗?
你感觉哪一句不会出错呢?
public class Test01
{
public static void main(String[] atgs)
{
System.out.println(1.0/0.0);
System.out.println(1.0/0);
System.out.println(1/0.0);
System.out.println(1/0);
System.out.println(0/0);
}
}
你对java中的无穷大和非数了解吗?
为了测试系统中的一个小功能,我很开心的修改了系统时间
然后,我发现,无论我怎么修改JSP,在Tomcat中浏览就是没有任何效果,整个一大悲剧啊
于是,我纠结了整整一下午,最后,想起来修改了系统时间
文件修改时间比修改前的还要早,当然不会去刷新啦,唉,悲剧。
将系统时间调好,删掉Tomcat下编译好的JSP目录
系统就正常啦
面壁去了~~