当IDE可以时,如何确保“ java”找到所有必需的类?

时间:2019-04-24 07:51:59

标签: java macos maven build classpath

我在这里呆了太久了。我有一个只有一个依赖项的Maven项目:

ERROR:  syntax error at or near "IF"
LINE 61:  IF (v_isAdmin > 0) OR (v_isPM > 0) OR (v_isDelgate >0)
          ^

我正在使用IDE,它本身安装了所有必需的依赖项。我编写了一个简单的代码,使用了<dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports</artifactId> <version>6.8.0</version> </dependency> 中的类。要创建一个包,我做了net.sf.jasperreports,并创建了mvn package。当我尝试以jar的身份运行jar时,出现了一个错误,提示java -jar myjar.jar

我只是不明白如何解决这个问题。 IDE能够找到类,但是当从命令行调用时,IDE无法找到类。这是为什么?我该怎么办?

我什至试图将Caused by: java.lang.ClassNotFoundException: net.sf.jasperreports.engine.JRDataSource保留在jasperreports-6.8.0.jar,但是那也不起作用。

/Library/Java/Extensions/的外观如下:

pom.xml

2 个答案:

答案 0 :(得分:0)

这是在我的项目中使用Maven阴影插件的部分,当然与您的完全不同:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.2.1</version>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <shadedArtifactAttached>true</shadedArtifactAttached>
                <artifactSet>
                    <includes>
                        <include>org.apache.poi:poi</include>
                        <include>org.apache.poi:poi-ooxml</include>
                        <include>org.apache.poi:poi-ooxml-schemas</include>
                        <include>org.apache.commons:commons-collections4</include>
                        <include>org.apache.xmlbeans:xmlbeans</include>
                        <include>org.apache.commons:commons-compress</include>
                    </includes>
                    <excludes>
                        <!-- Exclude main jar to avoid error 'Failed to create shaded artifact, 
                            project main artifact does not exist' -->
                        <exclude>${project.groupId}:${project.artifactId}</exclude>
                    </excludes>
                </artifactSet>
            </configuration>
        </execution>
    </executions>
</plugin>
<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.1.1</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <appendAssemblyId>false</appendAssemblyId>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
</plugin>
  

请注意,pom.xml的这一部分进入<plugins> ... </plugins>部分,就我而言,它位于maven编译器插件下方和maven jar插件下方。您可以明确包含某些依赖项,也可以明确排除某些依赖项。

结果将是目标文件夹中的2个文件,我个人使用的是原始名称的文件,另一个文件的原始名称以 shaded 或类似名称扩展。

如果在显示错误消息 ...中没有主清单属性,则按如下所示更改 maven jar插件的配置:

<configuration>
    <archive>
        <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
    </archive>
    <mainClass>com.suhail.main.CommandLineRunner</mainClass>
</configuration>

答案 1 :(得分:-1)

使用Maven程序集插件而不是Maven jar插件。

请参见what-are-the-differences-between-maven-jar-plugin-and-maven-assembly-plugin

Maven程序集插件会创建一个完全可部署的程序包,其中包含所有依赖项。

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.4.1</version>
                <configuration>
                    <!-- get all project dependencies -->
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <!-- MainClass in mainfest make a executable jar -->
                    <archive>
                      <manifest>
                        <mainClass>com.suhail.main.CommandLineRunner</mainClass>
                      </manifest>
                    </archive>

                </configuration>
                <executions>
                  <execution>
                    <id>make-assembly</id>
                    <!-- bind to the packaging phase -->
                    <phase>package</phase> 
                    <goals>
                        <goal>single</goal>
                    </goals>
                  </execution>
                </executions>
            </plugin>