化石原创文章,转载请注明来源并保留原文链接


mac机上安装jdk 1.8, jdk10,jdk 11。写一个javafx的界面程序,因原因使用jdk11以下。

写的工程中编译工程,出现java: release version 5 not supported。

工程project structure中,以下几个地方:

1、Project Structure | Project上,Project SDK选的是10,Lauguage Level选的是8。

2、Project Structure | Modules | Sources,Lauguage Level选的是5。

3、Project Structure | Modules | Dependencies,Module SDK选的是10。

4、Platform Settings | SDKs,JDK Home path选的是10的home。

5、Other Settings | Preferences for new projects |Build,Execution,Deployment | Compiler | Java compiler | Project bytecode version,选的是same as language。

尝试把第2项里的5改成10,然后再Rebuild。发现问题依旧。回头在去看第2项的地方,发现还是原来的5,看来这个设置下面改不掉。

因为是maven的工程,于是在pom.xml加入了下面内容:

    <properties>
        <maven.compiler.source>1.10</maven.compiler.source>
        <maven.compiler.target>1.10</maven.compiler.target>
    </properties>

然后必须在pom.xml上点出上下文菜单,reimport。最后再Build |Rebuild Project,问题解决。


1、上面的步骤中,改动pom.xml后reimport是必须要注意的一点

2、添加的内容中,maven.compiler.source可以改成1.8,在上述的环境中也能成功。

3、上面的属性,对应到了工程设置2中的level。maven reimport后可以看出来两者的对应。每次pom.xml的reimport,xml文件里的版本号会影响到工程的这个设置。


化石原创文章,转载请注明来源并保留原文链接



化石原创文章,转载请注明来源并保留原文链接


背景

一个Intellij,mavn工程。

1、使用了local的jar作为lib

2、使用main()方法作为入口方法

3、使用ftl文件作为模板(FreeMarker)

在使用Intellij开发的时候,没有任何问题。现在要发布到外部机器,希望用户能通过web默认端口80访问。

需要的步骤

1、通过Intellij的maven工具,package命令打包成war文件或者是war同等的文件夹

可能会遇到的问题:

因为使用local的jar,而不是maven reposity的,而local jar是通过File|Project Structure… |Library添加,所以package命令不能成功,遇上这个jar找不到问题。

解决方案:

在项目的pom.xml中,加入使用<systemPath>的<dependency>项,告知maven工具local的jar路径

注意:

如果项目非有springboot initializer生成,那么还需要在pom.xml中加入

<!--  手工设置:让打包成war的设置  -->
<packaging>war</packaging>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

一个完整的的pom.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>wlxsphb</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--  手工设置:让打包成war的设置  -->
    <packaging>war</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongodb-driver</artifactId>
            <version>3.11.2</version>
        </dependency>
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20190722</version>
        </dependency>
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.10.5</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>28.1-jre</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.sun.mail/javax.mail -->
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
            <version>1.6.2</version>
        </dependency>
        <dependency>
            <groupId>it.sauronsoftware</groupId>
            <artifactId>base64</artifactId>
            <version>1.3.1</version>
            <scope>system</scope>
            <systemPath>C:/Users/HanIT/.m2/repository/it/sauronsoftware/base64/javabase64-1.3.1.jar</systemPath>
        </dependency>
    </dependencies>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

2、在main()中,有初始化的代码,会在springboot模块前后初始化自己的类

可能会遇到的问题:

发布到外部tomcat,这个main就不会被主动运行。tomcat会由spring boot去寻找SpringBootServletInitializer继承类的configure()方法运行(代替这个main)。所以,所有的初始化没有机会,就导致后续的各种错误,而导致服务无法正常,最常见的就是各种NullException的发生。

解决方案:

1、在Override的configure()中,拷贝对应的初始化方法。视confiure()为入口方法。

有了上面两个大前提,把一个这样的web application放置到外部tomcat的步骤就是:

1、删空tomcat webapps下的ROOT文件夹下所有默认文件(这个方式让web application的根目录替代默认的网站根目录)

2、使用maven的package,打包出target下的war,同时会有同名目录放在war旁

3、拷贝这个同名目录到ROOT下,spring boot工程会出两个文件夹,一个为WEB-INF,另外一个为META-INF。WEB-INF中,含两个目录:classes和lib。classes包含的是Intellij项目中java(src目录)下的java代码产生的class(按原目录组织)文件和resources下所有文件(文件夹);lib下是项目中用到的maven引用的其他jar。META-INF文件夹可能是空的。

查错

发布到外部的tomcat,启动服务后,看不到自己的网站页面,或者看页面时见到错误。查错的方式是看tomcat的日志:在tomcat安装目录下,有logs文件夹,启动服务后会出现很多的log文件,主要是stderr字眼的文件和stdout字眼的文件。严重的错误,比如spring boot前就发生的错误,比如configure()方法就发生了导致springboot不能继续的错误,在stderr中能看到。而后续的各种mapping错误,信息等,都可以在stdout中看到。

常见的System.out.println()发出的信息,在这些文件里都会存在。

修改默认的8080端口

打开tomcat安装目录下的conf文件夹下的server.xml,查找8080字眼,应该能看到未注释的如下字眼:

<Connector port="8080" protocol="HTTP/1.1"            connectionTimeout="20000"            redirectPort="8443" />

改动其中的8080到80,保存。然后重启tomcat即可。


化石原创文章,转载请注明来源并保留原文链接



化石原创文章,转载请注明来源并保留原文链接


不是所有的库在maven repository都可以找到,所以很多时候我们还是得从第三方网站下载到jar,然后放置到本地。如果是Maven对应的项目,如果不使用maven方式,平时在intellij中调式可能不出问题,但在使用maven的build、compile等等命令的时候,就会发生错误。

这里就需要把本地文件添加到maven的pom.xml中。

下面是一个pom使用本地文件的写法例子:

<dependency>
    <groupId>it.sauronsoftware</groupId>
    <artifactId>base64</artifactId>
    <version>1.3.1</version>
    <scope>system</scope>
    <systemPath>C:/Users/HanIT/.m2/repository/it/sauronsoftware/base64/javabase64-1.3.1.jar</systemPath>
</dependency>

这里重要的是<scope>使用了system,然后用了<systemPath>元素告知本地jar路径。其他的地方都是名字,对应着填即可。


化石原创文章,转载请注明来源并保留原文链接



化石原创文章,转载请注明来源并保留原文链接


第一个查的地方是Chrome的cache。如果你总是要删除历史后才能得到更新的javacript,那么就是这个cache的原因。你需要做的是让Chrome不cache。

步骤是:

1、Chrome的调试面板

2、Network标签点击

3、找到Disable cache,打上勾


化石原创文章,转载请注明来源并保留原文链接



化石原创文章,转载请注明来源并保留原文链接


工程需要javabase64 1.3.1库,好好的maven dependency在pom.xml中,却发现jar文件一直同步不下来。用网页打开maven reposity,点击页面的view all,发现返回的json也是找不到资源。难道这个库在maven这里维护这么不积极?不知原因。

到javabase64的官网去能下载到jar的zip文件,解开后就可以把里面的jar手动放置到intellij工程,步骤:

1、File | Project Structure …

2、Project Settings | Libraries

3、出现的面板上分成三栏,中间一栏的左上角,点击那个+号(加号)

4、下拉菜单选择java

5、跳出的选择文件对话框中,定位到需要的jar文件,完成点击后就会导入这个jar到工程。

结束。


化石原创文章,转载请注明来源并保留原文链接