您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
java如何编译有jar依赖的java文件(纯命令行)java使用redis初探
发布时间:2021-11-24 23:42:53编辑:雪饮阅读()
上篇说过了java如何编译一个有依赖另外一个java类文件的情况及最后的运行测试,那么这次来了解下如何编译一个java文件再有依赖另外一个jar包的情况。
RedisJava.java:
import redis.clients.jedis.Jedis;
public class RedisJava {
public static void main(String[] args) {
//连接本地的 Redis 服务
Jedis jedis = new Jedis("localhost");
// 如果 Redis 服务设置了密码,需要下面这行,没有就不需要
System.out.println("连接成功");
//查看服务是否运行
System.out.println("服务正在运行: "+jedis.ping());
}
}
这里导入的这个外包类是存在于一个jar包中的,用jd-gui已经确认了目标路径是存在的。
但是如果直接编译这里的RedisJava就会像上篇一开始那样,因为缺少依赖的这个类而无法编译,那么此时对于使用-classpath来说是无效的,因为该类不在具体一个路径,而是具体路径中的一个jar包中,此时要用-Djava.ext.dirs参数指定jar包路径进行编译如:
D:\phpstudy_pro\WWW\redisLearning\java>javac -Djava.ext.dirs=./ RedisJava.java
这样就编译ok了。
那么同样的,对于运行包含有jar依赖的编译过的java类也是不能直接运行的,而且不仅仅要-classpath,还要-Djava.ext.dirs:
假如我只指定-classpath:
D:\phpstudy_pro\WWW\redisLearning\java>java -classpath ./ RedisJava
Exception in thread "main" java.lang.NoClassDefFoundError: redis/clients/jedis/Jedis
at RedisJava.main(RedisJava.java:5)
Caused by: java.lang.ClassNotFoundException: redis.clients.jedis.Jedis
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 1 more
可见同样是会报错的,假如我只指定-Djava.ext.dirs:
D:\phpstudy_pro\WWW\redisLearning\java>java -Djava.ext.dirs=./ RedisJava
错误: 找不到或无法加载主类 RedisJava
但是如果我同时指定了-classpath和-Djava.ext.dirs就运行成功了:
D:\phpstudy_pro\WWW\redisLearning\java>java -classpath ./ -Djava.ext.dirs=./ RedisJava
连接成功
Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out
at redis.clients.jedis.Connection.connect(Connection.java:207)
at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:93)
at redis.clients.jedis.Connection.sendCommand(Connection.java:126)
at redis.clients.jedis.Connection.sendCommand(Connection.java:121)
at redis.clients.jedis.BinaryClient.ping(BinaryClient.java:106)
at redis.clients.jedis.BinaryJedis.ping(BinaryJedis.java:195)
at RedisJava.main(RedisJava.java:9)
Caused by: java.net.SocketTimeoutException: connect timed out
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at redis.clients.jedis.Connection.connect(Connection.java:184)
... 6 more
这里虽然也有异常,但是这个是连接redis出现的问题,我检查下我的redis服务。
那么这里我本地redis服务的确有问题,于是乎我开启了虚拟机中另外一个redis服务并开启了远程连接,则我们上面的java代码就修改如:
import redis.clients.jedis.Jedis;
public class RedisJava {
public static void main(String[] args) {
//连接本地的 Redis 服务
Jedis jedis = new Jedis("192.168.43.170");
// 如果 Redis 服务设置了密码,需要下面这行,没有就不需要
System.out.println("连接成功");
//查看服务是否运行
System.out.println("服务正在运行: "+jedis.ping());
}
}
然后重新编译并运行就ok了:
D:\phpstudy_pro\WWW\redisLearning\java>javac -Djava.ext.dirs=./ RedisJava.java
D:\phpstudy_pro\WWW\redisLearning\java>java -classpath ./ -Djava.ext.dirs=./ RedisJava
连接成功
服务正在运行: PONG
最后介绍下redis在命令行下,非redis配置文件中也能便捷的开启服务的远程访问:
[root@localhost ~]# /usr/local/redis-6.2.5/src/redis-server --protected-mode no
3667:C 24 Nov 2021 10:37:42.280 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
3667:C 24 Nov 2021 10:37:42.280 # Redis version=6.2.5, bits=64, commit=00000000, modified=0, pid=3667, just started
3667:C 24 Nov 2021 10:37:42.280 # Configuration loaded
3667:M 24 Nov 2021 10:37:42.281 * Increased maximum number of open files to 10032 (it was originally set to 1024).
3667:M 24 Nov 2021 10:37:42.281 * monotonic clock: POSIX clock_gettime
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 6.2.5 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 3667
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | https://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
3667:M 24 Nov 2021 10:37:42.281 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
3667:M 24 Nov 2021 10:37:42.281 # Server initialized
3667:M 24 Nov 2021 10:37:42.281 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
3667:M 24 Nov 2021 10:37:42.316 * Loading RDB produced by version 6.2.5
3667:M 24 Nov 2021 10:37:42.316 * RDB age 87796 seconds
3667:M 24 Nov 2021 10:37:42.316 * RDB memory usage when created 0.84 Mb
3667:M 24 Nov 2021 10:37:42.316 * DB loaded from disk: 0.035 seconds
3667:M 24 Nov 2021 10:37:42.316 * Ready to accept connections
这里最重要的是参数:--protected-mode no
最后补充下,这里用的jar包是 jedis-2.9.0.jar
关键字词:java,jar,依赖,编译,命令行,redis