【问题标题】:jar is not available at runtime, why not?jar 在运行时不可用,为什么不呢?
【发布时间】:2015-03-06 00:42:49
【问题描述】:

我正在使用eclipse 开发和测试spring mvc 应用程序。我在开发过程中经常使用Run as...Run on server 来测试细微的变化。我遇到了 ClassNotFound 错误,其解决方案似乎涉及将几个 jar 移动到 tomcat 8 lib 目录中,以便它们可以在运行时使用。 (包含 jar 的类在 eclipse 中的应用程序构建路径中。)将 jar 移动到 tomcat lib 文件夹的问题是在编译时也需要 jar。当我将jar 移动到$CATALINA_HOME/lib 时,我收到一个错误,指出由于jar 在我的pom.xml 中存在重复的罐子。但是如果我从我的pom.xml 中删除它,eclipse 将不会编译该应用程序。 如何将 jar 移动到 $CATALINA_HOME/lib 并且仍然让 eclipse 编译我的应用程序?

我尝试设置<scope>runtime</scope><scope>provided</scope>,但这些都不能解决问题。这是我在pom.xml 中的内容:

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>javax.mail-api</artifactId>
    <version>1.5.2</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
    <scope>provided</scope>
</dependency>  

编辑#1:

我还尝试将jar 移动到tomcat lib 文件夹,然后将jar 添加到eclipse 中的buildpath 作为外部jar,以便我可以从pom.xml 中删除依赖项并且仍然有eclipse 编译应用程序。但是当我这样做时,eclipse 每次尝试Run As..Run on Server 时都会给我以下错误:

Several ports (8080, 8009) required by Tomcat v8.0 Server at localhost are  
already in use. The server may already be running in another process, or a  
system process may be using the port. To start this server you will need to  
stop the other process or change the port number(s).  

当然,我去了tomcat bin 文件夹并运行shutdown.sh,但这并没有阻止新的错误。

编辑#2

当我通过单击红色按钮从eclipse 中关闭tomcat 时,eclipse 表示tomcat 已停止。但是,当我通过再次执行 Run As..Run on Server 尝试 restart tomcat 时,我收到上面 EDIT#1 中描述的错误。当我完全关闭计算机并重新启动时,此错误的临时解决方案就出现了。然后我可以再次执行Run As..Run on Server 并重新创建这种情况。只是现在抛出了一个新错误。我记录了the new error in a separate posting。但是,每次我尝试执行连续的Run As..Run on Server 启动以测试代码中的微小更改时,我都会不断收到来自EDIT#1 的错误消息的相同问题。 所以这个当前的问题没有解决,因为每次我想从eclipse 重新启动应用程序时,将java mail jar 放在tomcat lib 文件夹中并使用提供的范围都需要不可接受的重新启动。 shutdown.sh也不行。

【问题讨论】:

  • 我们可以看看堆栈跟踪吗?
  • @AlessandroSantini lemme 重新启动我的机器,看看我是否可以重现错误以获取堆栈跟踪。
  • 知道它的eclipse,我感觉你的机器重启可能会解决你的问题。您应该保留您的 maven provided 条目
  • @Angad 请看我上面的编辑#2。谢谢。
  • 关于 Edit#1 中描述的错误:您在要运行服务器的端口上运行了一些进程。通过在控制台中执行“netstat -a -b”(以管理员身份运行)找出哪些,然后使用任务管理器杀死正在使用您的端口的进程。

标签: eclipse spring maven spring-mvc tomcat


【解决方案1】:
you can write lib launch file which you can run on maven install.
Inside launchConfiguration mentioned string attribute like below 
<stringAttribute key="M2_GOALS" value="clean package install"/>
<booleanAttribute key="M2_NON_RECURSIVE" value="false"/>
<booleanAttribute key="M2_OFFLINE" value="false"/>
<stringAttribute key="M2_PROFILES" value=""/>
<listAttribute key="M2_PROPERTIES"/>
<stringAttribute key="M2_RUNTIME" value="EMBEDDED"/>
<booleanAttribute key="M2_SKIP_TESTS" value="false"/>
<intAttribute key="M2_THREADS" value="1"/>
<booleanAttribute key="M2_UPDATE_SNAPSHOTS" value="false"/>
<stringAttribute key="M2_USER_SETTINGS" value=""/>
<booleanAttribute key="M2_WORKSPACE_RESOLUTION" value="false"/>
<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk1.6.0_45"/>
<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace:/Lib}"/>

This will compile all the jar file and put it into lib folder in webapp directory

【讨论】:

  • 感谢您和 +1 抽出宝贵时间分享此内容。我无法验证您的答案,因为我目前没有使用这项技术。但是,如果其他用户验证此答案或其他答案,我很乐意将答案标记为已接受。
【解决方案2】:

好的,我重新阅读了您的帖子,我想我已经成功了。要终止该 Tomcat 实例,请在 Eclipse 的控制台窗口中按红色按钮。 shutdown.sh 可能不会关闭它。

根据 JAR 文件,您在 Tomcat lib 目录和 Maven 依赖项中都需要它们。如果它们被“提供”,它们将在编译和测试时使用,但不会被部署(这是您所期望的)。然后你需要将它们复制到 tomcat/lib 目录中以避免冲突。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 2019-05-25
    • 2014-11-06
    • 1970-01-01
    • 2017-01-01
    相关资源
    最近更新 更多