我意识到这似乎是一个完全愚蠢的问题,而且这个问题是“文字墙”,但我觉得我已经超出了我的深度,需要一些指导。我已经阅读了有关此主题的几个问题,但似乎仍然找不到解决这一特定情况的问题。(请参考本文末尾的更新)
我们公司有一个用 Java 构建的应用程序,由几年前去世的开发人员作为可执行 JAR 包发布。从那时起,几乎不需要查看该代码,更不用说进行任何更改了。这真的很好,因为我在 VB.NET (Visual Studio) 中进行编程,虽然我可以阅读和理解 Java 代码,但我并不精通实际编写/调试该代码。
然而,最近出现的一个问题迫使我尝试查看这个 Java 代码,因为组织和数据结构发生了一些内部变化。我查看了他的“ src\”目录,找到了他的原始代码的旧版本,但无法在任何地方找到最新版本。我发现一些代码使我能够将当前正在使用的 JAR 提取到 CodeProject ( JarsVB.java ) 上的本地目录,因此当我试图找出正在执行的查询时,我能够查看一些文件用于一些随机操作。我不知道原始开发人员使用什么工具来创建项目/JAR,所以我安装了IntelliJ IDEA Community Edition 2018作为 IDE,到目前为止,它对我来说只是简单地查看代码,所以我可以了解一点它在做什么。
不幸的是,现在我需要更改 Java 代码并更新 JAR,而这就是我似乎无法弄清楚我需要做什么的地方。我有来自“解压缩”JAR 的本地代码副本,其中包含所有.java和.class文件(以及所有其他资源),但我不确定如何从该副本修改代码并重新编译可执行 JAR。
所以,我的目标如下:
.java文件。(我相信我可以很好地理解语法来完成这部分。)我一直在查看 IntelliJ 的文档,试图找出如何实现这一切,但我觉得我错过了一些东西。我将“项目结构”设置设置为指向特定文件夹,但我似乎无法让它在我指定的路径中实际构建任何内容。
我进入其中一个.java文件并进行/保存了一个小更改以进行测试,然后转到“构建”菜单并尝试了所有可用的构建选项:“构建项目”、“构建模块”和“重建项目”。每次,事件日志都会显示“所有文件都是最新的”(即使我更改了一个文件),因此我转到输出目录查看它构建的内容,但该文件夹是空的。
我查看了 IntelliJ 文档 将模块打包成 JAR …
我需要使用 Maven(用于学校项目)从单个 Maven 命令创建可执行文件。我从未使用过 Maven,并在 stackoverlow 上尝试了许多解决方案。该解决方案创建了一个 jar 文件,但该文件从未打开。
这是我的项目结构
src
com
project
code
swing
programm
interface
Main.class
Run Code Online (Sandbox Code Playgroud)
我知道这不是 Maven 约定,但是现在更改它意味着我必须调整大约 40 个类的导入(因为 intelliJ 不会完美地重构所有内容)。
<?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>MyGroup</groupId>
<artifactId>myProgramm</artifactId>
<version>0.7-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Hello World</name>
<description>Course Project</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc -->
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.25.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit/junit5-engine -->
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit5-engine</artifactId>
<version>5.0.0-ALPHA</version>
</dependency>
</dependencies>
<build>
</build>
Run Code Online (Sandbox Code Playgroud)
我必须在里面放入什么才能生成可执行文件?
我有一个使用 Kotlin 的多模块化 Gradle 项目。其中一个模块具有 main 方法以及对其他模块的依赖关系。我需要从这个模块创建一个可执行的 jar。所以我尝试通过创建这样的 Jar 任务来做到这一点
jar {
manifest {
attributes(
'Main-Class': 'my_package.RunnerKt'
)
}
from {
configurations.compileClasspath.filter{ it.exists() }.collect { it.isDirectory() ? it : zipTree(it) }
}
}
Run Code Online (Sandbox Code Playgroud)
我还尝试了Shadow Gradle 插件。在这两种情况下,胖罐子都是按预期创建的,它似乎拥有我所有的类和依赖项。但是当我运行 jar 时,java -jar出现以下错误:
java.lang.NoClassDefFoundError: Could not initialize class my_kotlin_object_classwhere my_kotlin_object_classis just a kotlin objectwith some variables.
在堆栈跟踪中,没有其他异常可能导致此异常,因此似乎只是此类本身存在问题。当我查看罐子时,我可以在那里看到这个文件。
我不明白这是 kotlin 对象本身和可执行 jar 的问题,还是我做错了什么?
我在NetBeans6.9.1中有一个项目.它在IDE内部工作正常.但是当我尝试运行jar时,NetBeans已经在dist目录下自动创建了,我得到了项目中的类的NoClassDefFoundError.我究竟做错了什么?我应该使用Ant还是其他东西(不知道Ant)在eclipse中我做了一个"create runnable jar",jar运行没有问题.NetBeans中有相应的东西吗?
更新:在dist/myJar中,我解压缩了jar,在清单中,我的项目的当前路径和根路径都丢失了.我手动添加它们,并从命令行重新创建jar.它有效.但是为什么NetBeans不会在jar的manifest的类路径中添加这些.我不明白
更新2我发现了问题.我认为这是一个严重的NetBeans错误.我已经完成了重构,并将包名称从myPackage.model更改为mypackage.model.但是NetBeans并没有正确地做到这一点.它确实将包的名称更改为mypackage,如树导航器中所示,但文件中的包名仍为myPackage.该项目在IDE内部执行的罚款,没有报告错误(尽管所有的类被声明为属于我的P ackage和他们在我的树p ackage),但是当我试图运行dist目录我里面的罐子得到了一个没有找到的例外.今天我注意到这堂课被报道为我的P.ackage/model而不是我的p ackage/model.我查看了类,重构完全搞定了一切.我手动将包名从myPackage中的类名更改为mypackage,并更正了所有导入(导入myPackage).这是一个已知的NetBeans问题????
谢谢
我使用Eclipse的"Export - > Java - > Runnable Jar File"函数生成了一个非常简单的可运行jar文件.我的HelloWorld类看起来像这样:
import javax.swing.JFrame;
public class HWorld extends JFrame {
public static void main(String[] args) {
new HWorld();
}
public HWorld() {
this.setSize(200, 100);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("Hello World!");
this.setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,在生成.jar文件后,使用命令"java -jar HWorld.jar"从命令行运行正常
但是,当我尝试自己执行jar(据说应该可以工作)时,我得到以下错误,我不知道为什么:
E:\Eclipse\workspace>HWorld.jar
Exception in thread "main" java.lang.NoClassDefFoundError: E:\Eclipse\workspace\HWorld/jar
Caused by: java.lang.ClassNotFoundException: E:\Eclipse\workspace\HWorld.jar
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
Could not find the main class: E:\Eclipse\workspace\HWorld.jar. Program will exit.
Run Code Online (Sandbox Code Playgroud)
我的清单看起来像这样:
Manifest-Version: 1.0 …Run Code Online (Sandbox Code Playgroud) 替换jar文件中的单个类文件是否安全?
类文件是否以不安全的方式相互引用?
GRAE
我正在尝试编写一个运行.jar文件的脚本.以下命令适用于终端(来自.jar文件夹):
java -jar "./myjavatest.jar"
Run Code Online (Sandbox Code Playgroud)
当我将这一行放在一个文件中并从同一个文件夹运行它(使用终端或双击查找器)时,我得到"无法访问jarfile ./myjavatest.jar".
我发现当我双击一个文件时,它实际上是从用户主目录运行的.是否可以从文件所在的文件夹中运行它?
我有一个可执行的JAR,它包含所有依赖项和测试类.我已经确认在执行jar时会调用main()方法.我正在尝试向main()添加代码,以便我可以运行特定的TestNG测试类.从TestNG.org上的文档来看,这似乎就是这样做的:
TestListenerAdapter tla = new TestListenerAdapter();
TestNG testng = new TestNG();
testng.setTestClasses(new Class[] { com.some.path.tests.MyTests.class });
testng.addListener(tla);
testng.run();
Run Code Online (Sandbox Code Playgroud)
我的文件夹结构很典型:
/src/main/java/Main.java
/src/test/java/com/some/path/tests/MyTests.java
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试编译它时,我收到此错误:
java: /src/main/java/Main.java:46: package com.some.path.tests does not exist
Run Code Online (Sandbox Code Playgroud)
无论如何我可以改变我的项目,以便main()中的testng.setTestClasses()可以访问测试类吗?
目前我正在尝试从项目目录的根目录中读取我的配置文件,为了使这个实际配置我想将其移动到外部位置然后从那里读取.
在以下代码中添加完整路径会引发错误:
package CopyEJ;
import java.util.Properties;
public class Config
{
Properties configFile;
public Config()
{
configFile = new java.util.Properties();
try {
// configFile.load(this.getClass().getClassLoader().getResourceAsStream("CopyEJ/config.properties"));
Error Statement ** configFile.load(this.getClass().getClassLoader().getResourceAsStream("C://EJ_Service//config.properties"));
}catch(Exception eta){
eta.printStackTrace();
}
}
public String getProperty(String key)
{
String value = this.configFile.getProperty(key);
return value;
}
}
Run Code Online (Sandbox Code Playgroud)
这是错误:
java.lang.NullPointerException
at java.util.Properties$LineReader.readLine(Properties.java:365)
at java.util.Properties.load(Properties.java:293)
at CopyEJ.Config.<init>(Config.java:13)
at CopyEJ.CopyEJ.main(CopyEJ.java:22)
Exception in thread "main" java.lang.NullPointerException
at java.io.File.<init>(File.java:194)
at CopyEJ.CopyEJ.main(CopyEJ.java:48)
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题 ?
我想使用jetty启动我的应用程序,所以我添加了下面提到的依赖项.当我运行主方法Jetty成功启动.(我正在开发一个struts2 + spring3 + hibernate maven项目,我也可以在tomcat中部署它)
现在我想从战争包装pom创建一个可执行jar.所以我在我的pom中添加了maven-assembly-plugin.(我尝试使用maven jar插件,但它没有添加依赖项)
插件
<build>
<plugins>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<archive>
<manifest>
<mainClass>com.dca.engine.StartDCA</mainClass>
</manifest>
</archive>
<packagingExcludes>WEB-INF/lib/jetty*.jar,WEB-INF/lib/org.apache.taglibs.standard.glassfish*.jar,WEB-INF/lib/org.apache.jasper.glassfish*.jar,WEB-INF/lib/org.eclipse.jdt.core*.jar,WEB-INF/lib/javax.servlet.jsp*.jar,WEB-INF/lib/javax.el*.jar</packagingExcludes>
<escapeString>\</escapeString>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.dca.engine.StartDCA</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.java</include>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
Run Code Online (Sandbox Code Playgroud)
嵌入式Jetty
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>8.1.10.v20130312</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-webapp</artifactId>
<version>8.1.10.v20130312</version>
<!-- <scope>provided</scope> -->
</dependency> …Run Code Online (Sandbox Code Playgroud)