杂七杂八的java笔记

reference

https://blog.csdn.net/lvshaorong/article/details/73881568 https://blog.csdn.net/yeqiuBOke/article/details/80897611 https://users.soe.ucsc.edu/~eaugusti/archive/102-winter16/misc/howToCompileAndRunFromCommandLine.html https://www.cnblogs.com/by-1075324834/p/5558035.html 菜鸟教程 think in java 第四版

脱离IDE编译java

工程目录

根目录/

编译

简单地在同一path下编译:

编译单个文件: javac -d classes src/xxx.java -d参数后跟class文件的输出目录,如果没有-d参数会在当前目录下生成class文件,而且没有根据包名建立相应的目录

如果主类中import了工具类,需要同时编译,比如 javac -d classes src/*.java


Linux下为UTF-8编码,javac编译gbk编码的java文件时,容易出现“错误: 编码UTF8的不可映射字符”

解决方法是添加encoding 参数:javac -encoding gbk WordCount.java

运行class文件

java -classpath classes test.ant.HelloWorld -classpath参数规定class文件的搜索范围,并指明程序主入口

不使用: -classpath java ClassName the file name specified must be a .class file that contains a main method

运行类时,不用加.class。 比如有一个类Hello.class,运行命令是java Hello而不是java Hello.class 。运行机制中是寻找类,而不是像编译的时候那样找到某个文件。

打包jar

cd classes 使jar包打出来之后最外层文件夹是属于包名的,不然会报错找不到类 jar -cvf xxx.jar ./*

打开这个jar,除了META-INF之外的木以要是属于包名的目录

运行jar

java -jar xxx.jar

java makefile

这是来自https://www.cnblogs.com/jiqingwu/archive/2012/06/13/java_makefile.html的一份通用makefile

 # A general java project makefile
 # Author: Wu Jiqing (jiqingwu@gmail.com)
 # create: 2012-06-12
 # update: 2012-06-13
 # version: 0.7

 # 设置你要生成的jar包的文件名
 # Set the file name of your jar package:
JAR_PKG = a.jar
 # 设置你的项目的入口点
 # Set your entry point of your java app:
ENTRY_POINT = test.A
 # 是否需要res目录,如果你的程序有图片、文档等,
 # 最好放入res目录中。
 # yes: 需要;no:不需要
RES_DIR = yes
 # 设置你项目包含的源文件
 # 如果你使用了package,请自己在src下建立相应的目录层次,
 # 并将源文件放在对应的目录中。
 # 如你要生成的一个类是 com.game.A,
 # 那么你的源文件应该是 com/game/A.java。
 # 多个类之间用空格间隔,如果一行太长,用'\'换行,
 # 建议一行一个。
 # 另外注意顺序,如果class A 引用 class B,那么B.java应该放在A.java前。
SOURCE_FILES = \
test/B.java \
test/A.java

 # 设置你的java编译器
 # Set your java compiler here:
JAVAC = javac
 # 设置你的编译选项
JFLAGS = -encoding UTF-8

 # 用法:
 # make new: 在你的工程目录下生成src, bin, res子目录。
 # 如果你定义的类包含在某个包里:请自己在src下建立相应的目录层次。
 # 最终的目录结构如下:
 # ├── a.jar
 # ├── bin
 # │     └── test
 # │             ├── A.class
 # │             └── B.class
 # ├── makefile
 # ├── res
 # │     └── doc
 # │            └── readme.txt
 # └── src
 #        └── test
 #                ├── A.java
 #                └── B.java

 # make build: 编译,在bin目录下生成 java classes。
 # make clean: 清理编译结果,以便重新编译
 # make rebuild: 清理编译结果,重新编译。
 # make run: make 之后,可以通过make run查看运行结果。
 # make jar: 生成可执行的jar包。

 #############下面的内容建议不要修改####################

vpath %.class bin
vpath %.java src

 # show help message by default
Default:
    @echo "make new: new project, create src, bin, res dirs."
    @echo "make build: build project."
    @echo "make clean: clear classes generated."
    @echo "make rebuild: rebuild project."
    @echo "make run: run your app."
    @echo "make jar: package your project into a executable jar."

build: $(SOURCE_FILES:.java=.class)

 # pattern rule
 # 不能处理两个类互相引用的情况,尽量避免
%.class: %.java
    $(JAVAC) -cp bin -d bin $(JFLAGS) $<

rebuild: clean build

.PHONY: new clean run jar

new:
ifeq ($(RES_DIR),yes)
    mkdir -pv src bin res
else
    mkdir -pv src bin
endif

clean:
    rm -frv bin/*

run:
    java -cp bin $(ENTRY_POINT)

jar:
ifeq ($(RES_DIR),yes)
    jar cvfe $(JAR_PKG) $(ENTRY_POINT)  -C bin . res
else
    jar cvfe $(JAR_PKG) $(ENTRY_POINT) -C bin .
endif

make new: 新建工程,在当前目录下生成src, bin, res(如果 RES_DIR = yes)子目录,类似Eclipse项目的目录层次。java源文件放 在src目录下,生成的class放在bin目录下。 make build: 编译工程。 make clean: 清除生成的class,以便重新编译。 make rebuild: 重新编译工程,相当于make clean; make build。 make run: 运行编译生成的应用。 make jar: 生成可执行的jar包。 make: 显示帮助信息。

java中的xml

  1. xml作为数据储存(很少)
  2. 存放配置信息

IDEA的maven项目中,默认源代码目录下(src/main/java目录)的xml等资源文件并不会在编译的时候一块打包进classes文件夹,而是直接舍弃掉。如果使用的是Eclipse,Eclipse的src目录下的xml等资源文件在编译的时候会自动打包进输出到classes文件夹。

java包

import和包机制

Java中的一个包就是一个类库单元,用import导入一个完整的库时,就会获得包, 例如`import java.util.*` , 包内包含有一组类,它们在单一的名称空间之下被组织在了一起。这个名称空间就是包名。

单独导入一个类,如位于java.util(utility库)中的Vector,可以在import语句中指定类的名字import java.util.Vector

包机制便于管理命名空间(name space),使类成员的名字相互隔离起来。如类A中的方法f()与类B中的方法f()不冲突。

一个编辑单元(.java file)有且仅有一个同名的public类,非public类在该包之外被隐藏。

编译一个java file, 里面所有的class都会得到一个.class file, 一系列的.class文件封装压缩到一起形成一个jar file.

库也由一系列类文件构成,每个类文件有一个public类,所以每个文件都有一个组件,如果将这些组件都归纳在一起,就可以使用package

package语句作为文件的第一个非注释语句。它指明该编译单元内的public类名位于该package的名字下面。

例如,对于MyClass.java

package mypackage;
public class MyClass{
//...
}

若想使用MyClass, 有两种方法

  1. 指定完整名称
mypackage.MyClass m = new mypackage.MyClass();
  1. import激活mypackage中的名字
import mypackage.*;
//...
MyClass m = new MyClass();

包名

java解释器工作时:

  1. 找到环境变量CLASSPATH, CLASSPATH中包含一个或者多个目录,被作为寻找包名的根目录。解释器开始寻找包名并将.替换成/, 从而生成从CLASSPATH的根目录开始的路径名
  2. CLASSPATH的根目录和形成的路径名连接在一起,成为CLASSPATH内的入口。以后搜索.class文件时,就从这些地方开始查找。

例如包package com.blabla.util包含两个文件

package com.blabla.util;

public class Vector{
	public Vector(){
		System.out.println("hello Vector");
	}
}

---
package com.blabla.util;

public class List{
	public List(){
		System.out.println("hello List");
	}
}

这两个文件都位于com/blabla/util目录下

此外若导入包括相同名字的两个库,在使用该名字时,也需要指定完整名称 如java.util.Vector v = new java.util.Vector();

Eclipse

编码

右键文件夹>properties>Resource>text file encoding 选择Other, 直接键入即可(本人用的ubuntu,下拉选项没有GBK,但是直接键入GBK,apply亦可)

运行

找到有主类的file, run as application

未找到主类

参考这个,很详细的各种原因: https://blog.csdn.net/chenleixing/article/details/44816629

比较实用的是:

  1. 找不到lib:右键Properties在Java Builder Path的Libraries的标签里面看是否有缺少的,重新引入即可
  2. 找不到xml: properties>builder里把.xml引入

getting JRE system library unbound

Right click on project—> Build Path–>Configure build path Now there are 4 tabs Source, Projects, Libraries, Order and Export

Go to Libraries tab –> Click on Add Library (shown at the right side) –> select JRE System Library –> Next–>click Alternate JRE –> select Installed JRE–> Finish –> Apply–> OK.

Access denied for user ‘’@’localhost’ to database

  1. 远程连接的问题

Check if user is allowed for remote connection, run below sql query on your database to allow your user to connect from everywhere.

Allow a user to connect from anywhere

GRANT ALL ON *.* to <user-name>@'<ip>' IDENTIFIED BY '<password>' Sample for root user :-

GRANT ALL ON *.* to root@'%' IDENTIFIED BY 'root';
// grant root user to connect from everywhere(%) , which has root password.
  1. 损坏的.classpath和.project

https://stackoverflow.com/questions/59899416/access-denied-for-user-localhost-using-password-no-in-eclipse-instead-o

Java和MySQL

首先mysql-connecter/J对于mysql5.x和mysql8.x和Maria DB使用的是不一样的,需要按需下载不同的mysql-connecter/J 然后java build path中add external JARs,添加这个connecter

对于mysql5,驱动是com.mysql.jdbc.Driver

Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test_demo","root","password");

mysql8.0是不需要建立ssl连接的,需要显示关闭 驱动com.mysql.cj.jdbc.Driver

Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test_demo?useSSL=false&serverTimezone=UTC","root","password");