Java 常用技巧

2021-01-26 language java

这里总结一些常用的技巧。

离线仓库

适用于一些离线使用场景,在某台在线机器上将仓库同步到远端,同时通过如下命令清理掉 _remote.repositories 文件,否则 Maven 会先尝试从远端获取包。

find -type f -name '_remote.repositories' -exec rm {} \;

修改默认的 Maven 配置文件,一般是 ~/.m2/settings.xml 文件。

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <localRepository>/opt/third/maven</localRepository>
    <offline>true</offline>
    <mirrors>
      <mirror>
        <id>central-proxy</id>
        <name>Local proxy of central repo</name>
        <url>file:///opt/third/maven</url>
        <mirrorOf>*</mirrorOf>
    </mirror>
  </mirrors>
</settings>

离线执行

可以通过如下 Maven 命令编译 Jar 包。

----- 通过-pl+目录指定子模块编译
mvn -U -pl hive -am clean package
----- 或者通过groupId:artifactId指定
mvn -U -pl org.example:hive -am clean package

在编译完成之后可以通过如下命令执行,这里使用的是目录方式指定子模块,同样可以切换到 groupId:artifactId 的方式。

mvn exec:java -pl hive -Dexec.mainClass="com.foobar.BasicClient"

如果主函数需要指定参数,可以在命令行中添加如下内容 -Dexec.args="arg0 arg1 arg2" 即可。

通过Java命令运行

当尝试通过 java -cp hive/target/hive-1.0.0.jar com.foobar.BasicClient 命令直接运行时可能会出现 java.lang.NoClassDefFoundError 类似的错误,这主要是依赖包不存在导致的,有如下两种解决方式。

将依赖包复制到 lib 目录下,并在执行的时候指定 Jar 包,修改 pom.xml 文件增加如下内容。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.10</version>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/lib</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

然后通过如下命令执行。

java -cp "/svr/foobar/code/hive/target/lib/*:hive/target/hive-1.0.0.jar" com.foobar.BasicClient

或者,将依赖 Jar 包打包到输出包中,同样修改 pom.xml 增加如下内容。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.3.0</version>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
        </plugin>
    </plugins>
</build>

执行的时候直接指定依赖包即可。

java -cp hive/target/hive-1.0.0-with-dependencies.jar com.foobar.BasicClient

日志级别

这里通过 logback 输出,在 pom.xm 增加如下配置,其中 logback-classic 会自动引入 logback-core 依赖。

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>2.13.3</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.9</version>
</dependency>

对应的配置文件保存在 resources/logback.xml 目录下,内容为。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <target>System.out</target>
        <encoder>
            <pattern>[%date][%level][%logger.%file:%line][%thread]%msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <logger name="org.apache.hadoop" level="INFO"/>
    <logger name="com.foobar" level="DEBUG"/>
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
    </root>
</configuration>

如果使用了 SpringBoot 架构,那么就同时增加 application.properties 文件,内容为。

logging.config=classpath:logback.xml

当打包后没有生效时,可以通过 unzip 解压 jar 包,或者通过 jar ftv xxx.jar 查看。

其它

版本切换

可以直接通过 which java 查看,如果是通过 alternatives 管理,一般以符号链接方式指向 /etc/alternatives/java 文件,此时可以通过如下命令进行更新。

update-alternatives --config java